【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-13 16:48
三面题这么简单吗。。。
1 回复 分享
发布于 2020-10-18 14:41
许愿AA面
点赞 回复 分享
发布于 2020-10-13 15:20
哎,不过楼主是三面问的这个??这我lc面的题啊,我有点混乱
点赞 回复 分享
发布于 2020-10-13 19:35
哪个岗位呀
点赞 回复 分享
发布于 2020-10-18 18:50
想问下lz微软三面和二面之间隔了多久呢?
点赞 回复 分享
发布于 2020-10-22 16:50
想请问楼主是面的哪个部门呀?🙈
点赞 回复 分享
发布于 2020-11-20 00:04
老哥,三面撕了三道题?
点赞 回复 分享
发布于 2020-11-21 14:15
第三题在这里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
微软面试都是算法吗😢
点赞 回复 分享
发布于 2021-04-08 17:02

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
评论
5
48
分享
牛客网
牛客企业服务