開發與維運

“我的一次微软面试经历”

作者 | Ashwin Goel
译者 | 弯月,责编 | 屠敏
出处:聊聊Python

01

我将简历(包括我的所有项目、成就和经验)发给了微软的15-20个人,希望至少能有一位可以推荐我参加在线编程测试。

重点:
勇敢地和陌生人联系,这只是构建关系网的一种方式。你拥有的关系网越强大,就越容易找到工作。

在与某人联系时,不要简单地打招呼并要求对方做推荐人,你可以写一封信详细介绍你的项目、经验、成就,并写出他们推荐你的理由。

邮件刚发出去1-2个小时,我就收到了微软的第一轮面试邀请,这是一次纯粹的编程测试。

02

2019年9月22日,我参加了第一轮面试。
我拿到了三个解决问题的题目,而且给出的时间也够。

其中一个问题是:
给定大小为n的数组,请以偶数和奇数交替的方式升序排序数组。
注:这是最简单的一道题。

在面试仅剩5分钟的时候,我的笔记本电脑崩溃了。这可能是最糟糕的情况了,但很幸运的是,过了一会儿后我可以继续测试了。

我写出了三道题的代码,并通过了所有测试用例,包括边界情况和复杂的测试用例。

我对第一轮面试充满了信心,并热切期待结果。

03

10月11日,结果宣布了,我成功地进入了第二轮面试。
第二轮面试应该是视频面试,我认为面试主要是数据结构,所以就开始为此做准备。

这次面试定在了10月14日。首先简单地做了介绍,然后面试官开始测试OOPS的概念。我很高兴,因为从大学开始我就不需要为这个话题发愁了,因为我很早就搞清楚了这个概念。

他们问了我有关继承的一些概念,例如多态性、方法重载和方法重写之间的区别、virtual关键字和抽象。

重点:
如果你不了解某个概念,那也不要给出不相关的答案,乖乖承认就好。然后询问更多有用的信息。这可以表明你愿意学习新事物,给面试官留下好印象。我并不了解virtual关键字,但我没有给模糊的答案,而是告诉他我没听说过,后来我们就这个问题讨论了2-3分钟。

面试的第二部分是解决问题。他们的主要目的是测试我们思路以及解决新问题的方法。因此,说出你的思路非常重要。

我拿到的问题如下:
假设有一个3维数组,且按照如下螺旋方式排序:
01 02 03 04
12 13 14 05
11 16 15 06
10 09 08 07




请问,从这类数组中搜索某个数字的最佳方法是什么?

起初,我没有想到好的解决方案,所以我提出了最差的解决方案(O(n²)),然后开始考虑优化解决方案。

我一边想,一边说出了我的方法,所以面试官也给予了我帮助,并给了我很明显的提示,最后我找到了正确的方法。

重点:
说出你的思路。让面试官知道你在想什么,他可能会引导你朝正确的方向思考。

跟面试官提出问题,进一步阐明问题。

从最糟糕的解决方案开始,然后开始对其进行优化。

无论你提出怎样的解决方案,他们都希望你写出代码,因此需要为此做好准备。

注:我开始想到的解决方案非常复杂O(n²),最后优化到了O(log(n)),我心中的喜悦难以用文字描述。
对于这轮面试,我也非常乐观,而且很幸运,我接到了下一轮的复试。

04

11月17日,我在学期末考试期间抽空来到了微软的班加罗尔办事处,因为我不想错过这个大好的机会。
老实说,他们的园区是一个理想的工作场所。真的很棒!

由于我提前到了,所以一直在前台等候,一边研究GeeksforGeeks上常见的数据结构问题。
很快我们就被带到了会议室,并得知我们这20名学生是从1万1千名在线申请人中筛选出来的,顿时让我感觉良好。

在简单的介绍开始后,面试正式开始。

第一回合
本回合主要是看简历。面试官说他们真的很喜欢我的简历。他们询问了我有关项目的问题,并了解了我以前做过的工作。

重点:
1、你必须熟知简历中的每个词。
2、不要写任何你不是十分清楚的东西。

很快他们就开始测试我的思维能力,并提出了两个常见的数据结构问题。

其中一个问题是如何反转链表。前一天晚上乘坐公交车的时候,我刚刚在GeeksforGeeks上阅读了有关这个问题的文章,而且我记得部分解决方案。经过一番思考后,我向他们解释了算法。他们还让我们用C++写出正确的代码,还通过示例进行了测试。

注:微软追求完美,每个面试官都表现出了这一点。每个算法和代码都需要通过测试用例验证正确性。

另一个问题是,假设你有一个改进的链表,链表中的每个节点除了正常的数据变量和指向下一个节点的指针之外,还有另外一个指针,可能指向链表的任何一个节点。现在你的任务是克隆这个数据结构。

image.png

在上图中,每个节点都有一个指向下一个节点的指针,一个数据项(即Node1,Node2…Node5),以及一个指向任意随机节点的随机指针。

我发现这个问题很棘手,需要一些思考。

第二回合
本回合主要是测试更深的编程技巧和更快的思维。
我拿到了两个问题:
1、编写代码,检查二叉树的高度。
2、编写代码,检查二叉树是否是二叉搜索树。
我写出了两道题的代码,但不得不多花点时间调试一些小错误。
这两个问题都需要利用递归来解决。





重点:
写完代码后,还有非常重要的一步:验证!

第三回合
这是最后一回合,面试官是微软的一位高级专业工程师,他已经在微软工作了8年。面试开始的时候,他首先问了一些关于我的简历的问题。他对我做过的一个项目IGBTQ CPU调度算法很感兴趣。我在白板上向他解释了这个项目。

下半场是解决问题。他给我的问题是:
考虑一个从1到n的数字序列。
接下来,在迭代(i)时,我们删除第(i + 1)项。

例如:
考虑 n = 20
迭代1:删除第二个元素
1 3 5 7 9 11 13 15 17 19
迭代2:删除第3个元素
1 3 7 9 13 15 19
迭代3:删除第4个元素
1 3 9 13 15
以此类推……







最后剩下来的数字称为幸运数字。
任务是检查给定的数字“ n”是不是幸运数字。
在经过反复思考后,我说出了解决方案,并得到了面试官的反馈,然后我根据反馈找到了解决方案的模式,并写出了代码。

接下来是一些常见的问题,有关我个人以及我想从事的工作。

重点:

  1. 你需要清楚为什么想进这个公司。你需要对他们的产品和计划进行足够的研究,并清楚地了解你的动机以及为什么想在这里工作。
  2. 在面试前,你需要准备明确而清晰的答案:为什么你想进这个公司,而为什么这家公司应该雇佣你。
  3. 不要说“我有信心”或“我正在努力”之类的话!具体说明你的答案,并举例证明你的观点。

05

最后,我想说这是有史以来最好的面试经历之一。我曾接受过多家顶级公司的面试,但以前从未感觉自己和面试官和面试过程如此亲近。别的公司可能会测试你的知识,并期望获得行业水平的答案,但微软更注重你的思维过程和编程技巧。我在整个过程中就感受到了这一点。

另外,我没有被录用。我想在本文最后说明这一点,因为对于我们这个年龄的人来说,最重要的是学习经验以及提升自我。我们的职业生涯才刚刚起步,被拒、薪水和便利性没那么重要。但是,我为什么被拒仍然是一个谜,我本人毫无头绪。我感觉面试非常顺利,本来也以为会有好结果。

然而,我失去的只是暂时的,但我获得的却是永久而无价的。

原文链接








Leave a Reply

Your email address will not be published. Required fields are marked *