【2021秋招_微软软开面经】2020.10.13 微软三面

1.螺旋矩阵
function spiralMatrix(n){
    let matrix = new Array(n).fill(0).map(ele => new Array(n).fill(0));
    helper(n, matrix, 0, n*n);
    return matrix;
    
    function helper(n, matrix, level, count) {
        if (n % 2 == 0 && level * 2 == n) return;
        if (n % 2 != 0) {
            if (level * 2 + 1 == n) {
                matrix[level][level] = count;
                return;
            }
        }
        
        for(let i = level; i < n - level; i++) {
            matrix[level][i] = count--;
        }
        for(let i = level + 1; i < n - level; i++) {
            matrix[i][n-level-1] = count--;
        }
        for(let i = n - 2 - level; i >= level; i--) {
            matrix[n-level-1][i] = count--;
        }
        for(let i = n - 2 - level; i > level; i--) {
            matrix[i][level] = count--;
        }
        helper(n, matrix, ++level, count);
    }
}
2.有序递增数组,寻找某个数字出现的次数,要求最小时间复杂度
写一个计算数字第一次出现的位置的函数
function getFirstPos(arr, target, l, r) {
    let i = l, j = r, mid;
    while ( i <= j) {
        mid = parseInt(i + (j-i)/2);
        if (arr[mid] > target) {
            j = mid - 1;
        } else if (arr[mid] < target) {
            i = mid + 1;
        } else {
            if (mid > l && arr[mid-1] == target) {
                j = mid - 1;
            } else {
                return mid;
            }
        }
    }
    return -1;
}
let res = getFirstPos([1,2,2,3,4], 2, 0, 4); console.log(res);
function getLastPos(arr, target, l, r) {
    let i = l, j = r, mid;
    while ( i <= j ) {
        mid = parseInt(i + (j-i)/2);
        if (arr[mid] > target) {
            j = mid - 1;
        } else if (arr[mid] < target) {
            i = mid + 1;
        } else {
            if (mid + 1 <= r && arr[mid+1] == target) {
                i = mid + 1;
            } else {
                return mid;
            }
        }
    }
    return -1;
}
完整版
function getNums(nums, target) {
    let l = nums.length;
    let left = getFirstPos(nums, target, 0, l-1);
    let right = getLastPos(nums, target, 0, l-1);
    if (left == -1 || right == -1) return 0;
    return right - left + 1;
}

function biSearch(arr, target, l, r) {
    let i = l, j = r, mid;
    while ( i <= j) {
        mid = parseInt(i + (j-i)/2);
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            i = mid + 1;
        } else {
            j = mid - 1;
        }
    }
    return -1;
}

function getFirstPos(arr, target, l, r) {
    let index = biSearch(arr, target, l, r);
    if (index != -1 && index > 0 && arr[index-1] == target) {
        index = getFirstPos(arr, target, l, index - 1);
    }
    return index;
}

function getLastPos(arr, target, l, r) {
    let index = biSearch(arr, target, l, r);
    if (index != -1 && index < r - 1 && arr[index+1] == target) {
        index = getLastPos(arr, target, index+1, r);
    }
    return index;
}

let res = getNums([1,2,3,3,4,4,4,5], 4);
console.log(res);
3.给一个由0和1构成的数组,计算0和1个数相等的最长子数组,返回其长度
function getLIS(arr) {
    let l = arr.length;
    let sum = new Array(l).fill(0);
    sum[0] = arr[0];
    for(let i = 1; i < l; i++) {
        sum[i] = (arr[i] == 1)? sum[i-1] + 1  : sum[i-1] - 1;
    }
    let res = 0, i = 0, j = l - 1, loop = 0;
    while (loop < l) {
        i = loop, j = l - 1;
        while (j > i && sum[j] != sum[i]) --j;
        if (j > i && sum[j] == sum[i]) {
            res = Math.max(j - i, res);
            break;
        }
        loop++;
    }
    return res;
}

let res = getLIS([1,1,1,0,0,1]);
console.log(res);
#微软##面经##校招##前端工程师#
全部评论
三面题这么简单吗。。。
1 回复 分享
发布于 2020-10-18 14:41
居然写了这么多道
1 回复 分享
发布于 2020-10-13 16:48
微软面试都是算法吗😢
点赞 回复 分享
发布于 2021-04-08 17:02
第三题在这里https://leetcode-cn.com/problems/contiguous-array/ 发一个python哈希表+前缀后解法  时间复杂度O(n) class Solution:     def findMaxLength(self, nums: List[int]) -> int:         lookup = {0:-1}         total = 0         max_len = 0         for i in range(len(nums)):             total += 1 if nums[i]==1 else -1             if total in lookup:                 max_len = max(max_len, i-lookup[total])             else:                 lookup[total]=i         return max_len
点赞 回复 分享
发布于 2021-01-21 22:48
老哥,三面撕了三道题?
点赞 回复 分享
发布于 2020-11-21 14:15
想请问楼主是面的哪个部门呀?🙈
点赞 回复 分享
发布于 2020-11-20 00:04
想问下lz微软三面和二面之间隔了多久呢?
点赞 回复 分享
发布于 2020-10-22 16:50
哪个岗位呀
点赞 回复 分享
发布于 2020-10-18 18:50
哎,不过楼主是三面问的这个??这我lc面的题啊,我有点混乱
点赞 回复 分享
发布于 2020-10-13 19:35
许愿AA面
点赞 回复 分享
发布于 2020-10-13 15:20

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
5
48
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务