【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-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
5 48 评论
分享
牛客网
牛客企业服务