微软STC的面试走了五轮,不过由于周末手机没电关机了,也不知道挂了没有.
早上九点多到sigma大厦,等到十点开始面试,可惜北京太冷,没有穿人字拖去面试.
第一轮面试官先是要我向他介绍我做的系统,并且假设他完全不了解这个东西.当我说到这边有求余弦相似度的时候,面试官问了我怎么优化求Similar Pair的问题,虽然我记得google有一篇论文叫"Scaling Up All Pairs Similarity Search"的论文讲到了这个问题,能够把算法复杂度优化到O(N^2)一下,但是当时不记得具体怎么做了,只能讲了一些工程上对常数系数的优化.说完之后又要我写那个反转单词串的经典题目,不过还没等我写完面试官就说面试时间已经完了...
第二轮面试官主要问的是算法,先是问了一个如何判断两个矩形是否相交的问题,我先是很快给出了一个两个平行矩形是否相交的解法,之后面试官提到如果矩形不平行呢?我提出了两个解法,一个是通过线的相交关系来判断矩形是否相交,一个是通过一个矩形的端点是否落在另外一个矩形内的方法来判断是否相交,不过面试官似乎不大满意.最后的问题是"如果有两个人轮流往一个圆桌上放硬币,每个人只能放一个,并且不能有重叠,直到有一个人没有地方放为止,最后那个没有地方放的人输,然后问有没有必胜的策略",这个问题想了一会也想到了答案,就是先放者把第一个硬币放在圆桌的正中心,然后无论后放者如何放硬币,先放者只要把下一个硬币放在后放者所放的硬币关于圆心对称的位置就可以了,这样先放者必胜.
午餐是和第二个面试官一起吃的,又痛骂了一番北京政府...
第三轮面试的过程比较囧,先是考了一个平衡二叉树操作的问题,然后面试官现场出了一道题,我先是看出了错误,不过在和面试官的争论中被面试官误导了,以为面试题是正确了,然后讨论了很久还是没有得出解法...囧啊..
第四轮面试的面试官是mobile search的负责人,考到了找出连续N的元素中缺失的元素的问题,我之前的blog有写过这个,不过这次面试说可能出现负数,当然稍微改一下就可以了.郁闷的是和面试官用中文说了半天算法那个面试官就是没有听懂,及其怀疑这个面试官不是中国人...于是只好把code写出来.面试官就懂了..之后和面试官扯了一大堆移动搜索的机遇与趋势的问题...
最后一轮是经理面,面得很是郁闷,不知道是那个经理比较忙的缘故还是故意要压力面,他在面试的时候一直在自顾自的敲电脑,基本不听我说也基本不说话,搞得我面试表现很糟糕...面试的题目是"给出一个二维数组,中间有元素0和1,需要把所有全部元素是1的子图找出来",我先是把题目理解错了,做出来之后他才告诉我说我把题目搞错了..然后就给出了一个广度优先遍历的解法,面试官说不能有回溯,栈什么的,之后给出的算法是"从第一行开始遍历,每出现一个新的子图给出一个唯一的id,如果扫描到后面发现有之前标识的多个子图其实是连通的,则当作一个冲突记载下来.在第二次扫描时合并所有的冲突",可是面试官还是说不对,要给出一个空间复杂度是O(1)的解法.我只能想出上一种解法的改进发,不过只能解决有很少冲突的方法,就是把冲突集的信息记载在图中,结果面试官一定说这种解法是不对的...当时我已经被压得没有信心了,就没有去和面试官争论,结果过了很久还是没有想到空间复杂度O(1)且时间复杂度为O(MN)的解法.最后只是把之前想出的空间复杂度为O(K),K为冲突的个数的code写了出来.
这次面试之前四轮表现得还可以,说明能力方面还是木有问题的,不过最后一轮表现得太弱了..唉...
之后MS又加了一面,题目是有一个环路,中间有N个加油站,加油站里面的油是g1,g2...gn,加油站之间的距离是d1,d2...dn,问其中是否能找到一个加油站,使汽车从这个加油站出发,走完全程,这个题有一个O(n)的算法,最多扫描2N次元素,就是先从任意一个点a开始扫描,如果到点b和点b-1之前汽车没油了,那么说明点a到点b-1都不是可能的解,所以只要从点b开始继续扫就可以了,直到有一个点c,从c出发能够成功返回到c,那么c就是需要的解,如果再次扫描到了点a还没有找到解则说明无解.最坏情况就是c=a-1,那么需要扫描2N-1个加油站,当然可以在第一圈扫描时记载部分结果来使第二圈扫描更快.