今天苏州微软来我院做了个宣讲顺便招一波实习生,机缘巧合我正好也投递了,就抱着试试看的态度来面一波。苏州微软主要项目是office365和bing,具体的还不是很了解。
笔试
首先是笔试,三道算法题:
第一题:LeetCode 59. Spiral Matrix II
第二题:LeetCode 611. Valid Triangle Number
第三题:没记太清楚,因为也没写出来,大体是说微软要开party,要用几条线路点亮所有的灯,有的灯亮着,有的灯没亮。没亮的灯需要用电线连接亮着的,问全亮所需的具体时间是多少,英文题目刚开始看的不是很清楚,现在想想才明白。输入两个数组,第一个表示第i个灯泡和前一个灯泡的距离,第二个表示第i个灯泡是否亮着。现在有点累,不太想解决这个问题了,之后找一下更新一下。
笔试大概写出来两题吧,然后就被安排面试了,笔试刷了一部分人。
面试
一面:谈了谈项目,然后做题,非常简单,两个有序数组,第一个merge到第二个数组上,我脑子一热先写的是从尾部比较,然后插入,写的时候自己也觉得复杂度比较高。面试官看代码非常仔细,指出了很多细节上的问题。然后问有没有更好的实现办法。我想了一下,确实有,就是从尾部比较,直接把最大的数字放在计算好的最终下标就行了,避免了后面插入所需要的移动操作,这也是顺序表的一个弱点。三个指针分别记录两个数组要比较的值,和当前应该存放最大值的位置,这样就可以用o(n)的时间复杂度完成一个merge。面试官很年轻,人也随和。
二面:没问任何东西,直接做题:实现一个有getMax()
函数的栈。这里首先写的也不好,一开始的思路是push的时候判断并更新最大值,pop的时候如果是最大值,就重新遍历获取最大值。显然这个思路复杂度很高。面试官问我有没有更好的解决办法,我真的比较菜吧,想了一会才想到,就是用空间换时间的方法,再使用一个数组,当每个数push进来的时候,存储当前栈内的最大值,有一点点动态规划的思想。就是Max[i] = Math.max(number,Max[i-1]);
。写完了时间也差不多了,面试官同样给我指出了一些非常细节的问题。
三面:聊了聊经历、性格,做过什么,没有问具体的项目,然后做题:判断二叉树是否平衡。这题用递归实现比较简单,我开始把思想说了一遍,就是通过递归,一直到子结点,然后逐层返回,用一个数据结构存储当前高度,然后就写了一遍代码,但代码写的不好,没有按照思路上的来,可能是对思路没有信心吧。然后面试官很关心地提醒我,你的思路是对的,为什么不照着实现呢,然后我就集中精神按照思路实现了一遍,大体上是没什么问题了,不过还是有一个递归先后的小问题被面试官指了出来。然后说时间也差不多了,你的coding需要提高啊,多练习练习吧。我很不好意思地说是是是。最后告诉我需要讨论一下,很快给我答复。
半小时后收到HR电话,面试通过了,等批复,如果顺利下周会给口头offer.
感想
微软的整体气质确实很好,所有面试官都和蔼可亲、有活力、有自信,也不会对你指手画脚,只要你有能说的他们都很愿意聆听。然后在技术方面,对实习生题目出的都不难,但非常非常注重代码质量。读代码特别快,我的代码写的超乱都能很快看懂并且指出若干个可能会产生边界条件问题的用例。
实在没有想到居然过了,在此记录一下面经,希望能拿到offer吧,也希望被误以为符合实习条件的自己能够努力一点,早日真正符合实习条件。
网友评论