2021 年 7 月,微软来到我校为 FTE 和暑期实习生选拔候选人。在申请实习生职位的 230 名候选人中,最终只有 18 名学生被选中。整个过程是虚拟的,主要分两轮进行。
编码回合:编码回合在 Codility 平台上进行,由 2 个问题组成,需要在 90 分钟内解决。问题很简单,但在第一次提交后无法重新提交答案,因此我们必须在提交前检查所有极端情况。
- 2只青蛙可以从给定输入数组中的任何索引开始。该函数应该返回这些青蛙可以在它们之间创建的最大可能距离(两者的索引值之间的差异),让它们彼此跳得更远。青蛙只能跳到更高值的元素或一些相同高度的元素上,它们不能跳过任何元素。详细的完整问题在此处给出。
- 由字符’a’ 和 ‘b’ 组成的字符串可以分解为相似的连续字母块。确定要添加的最小字符数以使所有块的长度相等。 (https://www.geeksforgeeks.org/generate-a-string-consisting-of-characters-a-and-b-that-satisfy-the-given-conditions/)
只有 44 名来自这里的学生进入了下一轮的候选名单。
面试轮次
第一轮(技术面试):这一轮进行了将近45分钟,还算顺利。面试官很友好,问了我一个编码问题,让我解释我的方法。问题是最大和路径,我首先解释了一个蛮力解决方案,然后我们就其他方法进行了 30 分钟的讨论。最后,他给了我一个提示,并告诉我编写我的方法。
第 2 轮(技术面试):下一轮持续了大约 1 个小时,然后又是一轮,主要是编码轮。面试官问了我 3 个问题,我不得不展示我的屏幕并为他运行程序。
- 第一个问题是从地图中删除每 5 个元素。该程序很简单,但他检查了边缘测试用例,经过一些修改后,它运行正常,然后他转向了网络问题。
- 检测链表中的循环。我告诉他两种方法——使用一组节点和使用 Floyd 的循环检测算法,但结束了,但只编码了前一种方法。 (提示:练习编写整个程序,而不仅仅是函数)
- 第三个问题是在字符串搜索经典模式的变体。我告诉他蛮力解决方案,然后是最优化的方法(即使用 KMP 算法)。但是,由于我对 KMP 的整个代码不是很熟悉,所以我向面试官传达了同样的信息。他说继续写我能写多少。最后,在面试官的帮助下,我完成了大部分课程。由于时间紧,我没有运行程序,而是面试官告诉我他会检查代码。
此后,他问我是否有任何问题要问他,并结束了这一轮。
第三轮(技术+人力资源):面试官先简单介绍一下,然后从我的简历开始,问我对当前技术市场的趋势了解多少。
- 然后他开始问系统设计问题,而我对这些问题几乎一无所知。看到我的困惑,他问我的教学大纲中是否有系统设计,我的回答是否定的。
- 然后他转向 OOP,问我接口和抽象类之间的区别以及我们何时使用接口。
- 最后,他问了我一个简单的编码问题——给定一个数组 ‘Arr’,将 n 个元素从一个起始索引(比如开始)移动到另一个索引(比如目的地),没有额外的空间。
- 我在很短的时间内编写了整个代码,但他基本上是想检查我找到各种边缘测试用例并在我的代码中涵盖所有这些用例的能力。在我们检查并运行了所有边缘案例之后,他问我是否有任何问题要问他,并给我反馈了我的表现,并结束了这一轮。
结果在几个小时内公布,我很高兴地发现我是被选中的 18 名学生之一。
提示:
- 我对所有将在未来几周或几个月内参加面试的候选人的建议是在整个过程中保持冷静和自信。
- 永远不要停止与面试官的互动,即使他们自己不是很互动。
- 根据我的经验,这些公司不仅会测试你的技术知识,还会测试你在面试过程中的互动方式和处理困难情况的方式。如果您遇到问题,请不要害羞向面试官寻求帮助,因为这表明您可以在团队中很好地工作。
- 对于校内回合,准备诸如 OOP、DS/Algo 之类的主题就足够了,但如果您有时间,还可以准备系统设计并随时了解当前的技术趋势。
判决:选择
感谢您阅读这篇文章。希望这对你自己的面试有所帮助。干杯!