一面:
自我介绍+算法题
简短的介绍了一下项目背景,面试官也没咋详细问,接着就是一道算法题
算法题:二维平面上有若干个点,求出所有欧氏距离和曼哈顿距离相等的节点对数。(面试官有解释什么是欧氏距离和曼哈顿距离)
强调若干个节点可能有重复的情况,但是可以先想想节点不重复情况的算法。
我最终只答出了不重复情况下的(就是找横坐标相同的节点对和纵坐标相同的节点对求和呜呜太菜了),然后写好了代码,面试官提醒我代码有可以改进的地方,然后又改了改。。。(过程非常紧张,感觉脑子停止了运作,一个简单的东西改了好久)后面面试官一直引导我思考节点重复情况的,可是根本想不出来,气氛一度非常尴尬,最后时间来不及了,面试官让我回头再想想。面试结束
我以为一面估计是凉凉,感觉自己在coding方面太菜了不敢再经历第二次一面,没想到后来给我发邮件通知的是二面,欣喜若狂
二面:
英文!自我介绍+两道算法
幸好我早有准备,否则临场英文还真不知该咋发挥,建议面微软的uu们都准备个英文自我介绍还有项目介绍,很多面试官都要求这个。
介绍完了就开始写代码:
1、二叉树的最近公共祖先(Lc原题)
我用递归做的,问了时间复杂度,以及优化方案,优化方案没想出来,依旧是引导,告诉我可以在终止条件做文章,或者加全局变量。。。依旧是啥也想不出来(太菜
2、非负数组求和能被3整除的最大子序列(可以不连续)
我用取余做的,说了下思路就到点了,按照惯例问了面试官几个问题。
总体感觉,微软比其他所有公司都看重算法能力,也不仅仅是能解出来,最好还要在复杂度上达到最优,对于项目经历啥的并不那么care。
一面
1、在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,
一个解答:这需要两次遍历,然后再遍历一次原数组,
将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。
给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。
//百度别人的解题经验 居然提问过程和解题过程都和我一模一样😓
二面
这道题我一开始用最白痴的方法 然后被要求优化 提示了蛮多的 我还是不会
我写的bfs 然后被说空间复杂度很大 要用bfs