首页 > 微软中国校招一二三面面经
头像
ShouldBeOk
编辑于 2020-12-14 23:03
+ 关注

微软中国校招一二三面面经 内部员工回复

===12.14更新===
获得了feedback,一面Hire,二面三面No Hire。
反而是感觉良好的两轮No Hire.
一面:尝试多次且没要提示(good)。
二面:花了太多时间且没要提示(bad)。
三面:问题分析和系统思维not good,CS背景not good,coding过于复杂且有bug。

feedback尖锐深刻,是秋招获得的最有价值的信息和资料,等价于一个北京28w的offer。

===原帖===

一面leetcode 297       准hard
二面leetcode 1358     准hard
三面leetcode 4               hard
三轮全是hard,无提示撕出。三面hard只20分钟,撕出最优解,依然被吐槽,第二天收到感谢信。

虽然败了,但我是败的一点都不服的!

===11.28更新===
有老哥觉得我有点过于纠结于最优解了。
所以在此贴一下代码,从而表达为何我过于纠结:
20分钟白板撕出,34行处加上 '||' 可AC leetcode第四题。
复杂度O(log(min(m,n))). 算法导论解。
public int getKth(int[] arr1, int[] arr2, int k) {
    if (arr1 == null || arr2 == null) {
        throw new RuntimeException("Invalid Input Arrays");
    }
    int [] longArr = arr1.length > arr2.length ? arr1 : arr2;
    int [] shortArr = longArr == arr1 ? arr2 : arr1;
    int longLen = longArr.length, shortLen = shortArr.length;
    if (k < 1 || k > longLen + shortLen) {
        throw new RuntimeException("Invalid k");
    }
    if (shortLen == 0) return longArr[k - 1];
    if (k <= shortLen) {
        return getUpMedianOfTwoSortedEqualLenArrays(shortArr, 0, k - 1, longArr, 0, k - 1);
    } else if (k <= longLen) {
        if (longArr[k - shortLen - 1] >= shortArr[shortLen - 1]) {
            return longArr[k - shortLen - 1];
        }
        return getUpMedianOfTwoSortedEqualLenArrays(shortArr, 0, shortLen - 1, longArr, k - shortLen, k - 1);
    }
    // k > longLen && k < longLen + shortLen
    if (shortArr[k - longLen - 1] >= longArr[longLen - 1]) {
        return shortArr[k - longLen - 1];
    }
    if (longArr[k - shortLen - 1] >= shortArr[shortLen - 1]) {
        return longArr[k - shortLen - 1];
    }
    return getUpMedianOfTwoSortedEqualLenArrays(shortArr, k - longLen, shortLen - 1, longArr, k - shortLen, longLen - 1);
}

private int getUpMedianOfTwoSortedEqualLenArrays(int[] arr1, int s1, int e1, int[] arr2, int s2, int e2) {
    if (arr1 == null || arr2 == null) {
        throw new RuntimeException("Invalid Input Arrays");
    }
    if (s1 < 0 || e1 >= arr1.length || s1 > e1
        s2 < 0 || e2 >= arr2.length || s2 > e2) {
        throw new RuntimeException("Invalid input start end");
    }
    if (e1 - s1 != e2 - s2){
        throw new RuntimeException("Length not equal");
    }
    while (s1 < e1) {
        int mid1 = s1 + ((e1 - s1) >> 1);
        int mid2 = s2 + ((e2 - s2) >> 1);
        int offset = ((e1 - s1 + 1) & 1) ^ 1;
        if (arr1[mid1] == arr2[mid2]) {
            return arr1[mid1];
        } else if (arr1[mid1] > arr2[mid2]) {
            e1 = mid1;
            s2 = mid2 + offset;
        } else {    //arr1[mid1] < arr2[mid2]
            s1 = mid1 + offset;
            e2 = mid2;
        }
    }
    return Math.min(arr1[s1], arr2[s2]);
}


更多模拟面试

全部评论

(30) 回帖
加载中...
话题 回帖