微软IDC面试经历 |设置 156(校外全职)
我通过推荐计划向微软申请了软件开发工程师的全职职位。所有通过推荐申请的候选人都被邀请在 2-3 周后在 co-cubes 平台上进行在线编码测试。
在线编码回合(在 Co-Cubes 上) :-
在 75 分钟的时间内给出了三个问题来解决。顺便说一句,在 co-cubes 平台上解决是一场噩梦,没有自动完成,甚至无法复制 - 粘贴或手动测试您的代码。
- 问题 1(2 - 分数) :给定一个单链表,其中包含一些正数(有效数字)和零(无效数字)。转换链表,如果下一个有效数字与当前数字相同,则将其值加倍并将下一个数字替换为 0。修改后,重新排列链表,使所有 0 都移到末尾。
例如 2 -> 2 -> 0 -> 4 -> 0 -> 8
答案:– 4 -> 4 -> 8 -> 0 -> 0 -> 0 - 问题 2(3 - 分数) :我不记得了。它是基于数组的。
- 问题 3(5 - 分数) :编写一个函数,接受二叉树的根作为其参数,并返回从根开始最大深度的所有叶节点的总和。
例如………………1
………………/\
………….2/……3
………… / \
……….2……1
答案:- 2 + 1 = 3
解决方案的系统测试是在您提交所有 3 个问题后完成的,并且不会向您显示结果(无论所有 3 个问题是否正确)。但是,您在 co-cubes 上获得了一个非常弱的测试用例来检查您的解决方案,这很容易显示误报。
您必须解决所有 3 个问题才能获得本轮资格。
所有通过编码轮次的学生都被邀请到 Microsoft Hyderabad 进行进一步的面试。
团体飞行回合:-
大约 150 名学生参加了小组飞行——飞轮。这是一次纸笔测试。我们只得到了一个问题,需要在 45 分钟内解决。
- 问题– 给定一个字符串,将其划分为最少数量的子字符串,使得每个划分的子字符串都是一个回文。输出所需的最小分区数。这是一个标准的动态编程问题,https://www.geeksforgeeks.org/dynamic-programming-set-17-palindrome-partitioning/。
我们必须编写从输入到输出的整个程序,以及一些测试用例(他们想测试你的程序测试技能以应对极端情况)。您可以使用任何语言。
注意: - 判断标准是代码的正确性。尽量编写干净的代码并使用有意义的变量和函数名称。拥有正确运行代码的人(即使是 DP 的指数时间复杂度)比更快的错误代码更容易被选中。
近 30 - 35 名学生被选为下一轮。
第 1 轮(技术):-
面试官先把我的简历彻底看完了。他对我有竞争力的编码档案印象深刻,然后让我解释我的一个项目。然后他问了我两个算法问题。
- 问题 1 – 给定一棵以某个节点为根的树,找到最大高度,同时打印路径上的所有节点的最大高度。 https://www.geeksforgeeks.org/write-ac-program-to-find-the-maximum-depth-or-height-of-a-tree/
我必须从输入到输出在纸上完全编码,然后彻底解释整个代码。 - 问题 2 – 给定一个包含正、零或负元素的 NXN 矩阵,找到总和最大的子矩阵。 https://www.geeksforgeeks.org/dynamic-programming-set-27-max-sum-rectangle-in-a-2d-matrix/
即使经过深思熟虑,我也无法提供最优的 O(n^3) 解决方案,并为他提供了 O(n^4) 的蛮力 + 预处理解决方案。他没有帮助提示。过了一段时间,他问我得到的代码解决方案,并打断我说没关系,因为我已经写到一半了。
面试进行了大约一个小时。
第 2 轮(技术):-
这是最难的一轮面试。面试官从字面上问了我阳光下的一切。
面试官先让我介绍一下自己,她在看我的简历。她询问了我的竞争性编程档案和我的爱好。我被问到几个关于多线程的操作系统问题,它是现实生活中的实现。之后,我遇到了一个设计问题,
- “假设你是微软的项目经理,设计一个像 WhatsApp 这样的消息服务应用程序”。您必须以图表的方式解释所有要点和特征,以便即使是非技术人员也能理解。
然后她从我的简历中记下了四个部分,即数据结构和算法、编程语言 (C++)、DBMS 和客户端脚本,然后让我在这四个方面给自己打分。
首先,她开始询问诸如“什么是树”之类的基本问题,然后深入到 BFS 和 DFS、它们的算法、用途以及其中一个比另一个更受青睐的地方。这导致对 Dikstra 的最短路径算法的彻底讨论。根本原因是检查您的深入知识。
在 DSA 之后,讨论转移到 C++、指针、它们的用途以及结构、类及其指针处理之间的区别。讨论围绕 OOPS 概念进行,例如多态性、函数重载和覆盖。
然后她继续进行网络问题。这个讨论像递归 DFS 一样继续进行,因为我们讨论的所有内容都导致了一些其他主题。我记得的几个主题和问题是,“什么是 IP”、“为什么机器需要 IP”、“什么是静态和动态 IP,以及何时优先于另一个”、“防火墙”、“加密方法 /密码学”、“关于 HTTP 和 HTTPS 协议”以及关于“客户端和服务器端脚本”的全面问题。讨论也转向了离题的问题,例如,我们必须设计一个通过语音识别情绪的机器人/系统,您将如何以及使用哪些参数来做同样的事情?
最后,我们结束了关于网络的讨论,她问了我两个简单的 DBMS SQL 查询,一个是“打印表中的第二大数字”。
这次采访进行了一个多小时。面试官非常乐于助人和友好,每当我遇到困难时都会给出提示。
注意: - 如果您被卡住或无法回答,请不要惊慌。诚实面对该做什么或不知道。如果问题是事实,你可以承认你不知道,而不是胡说八道。但是,对于思考/头脑风暴的问题,最好是坚持不懈并继续尝试。
第三轮: -
现在,只剩下10-12名学生。很少有人为此进行过 HR 轮次,甚至很少有人没有进行过这一轮次。我的是技术轮。
我的采访是由一位资深人士进行的。他要求我自我介绍,然后继续询问我所有的项目。在整个采访过程中,他没有交叉地倾听——质疑我。之后,他问我有什么问题要问他。我问了几个问题,就结束了。
半小时内公布最终结果,最终选出9人。幸运的是,我是其中之一。
整个面试过程花了将近11个小时。
建议:-
除了 OOPS 概念、OS 和 DBMS 知识外,还需要清晰的数据结构和算法概念。项目也是必要的,有一些有趣的项目肯定会引起面试官的好奇心。应该记住,他们寻找的是在不同领域具有知识的平衡候选人。
在面试过程中,不断与面试官沟通,保持好奇并交叉提问。