微软面试经历 |校内实习
所以,最近,微软来我们校园实习,在大约 150 人中,有 10 人被选中。这是我整个面试过程的经验。
第 1 轮(在线编码轮):
编码回合在 mettl 上进行,我们必须在 90 分钟内解决三个问题。这些问题是从一个庞大的数据库中挑选出来的,因此,每个人都被分配了不同的集合。我的问题是——
1)给定一个linux中的目录路径,在遍历完完整路径后,找出你离主目录的距离。
https://www.geeksforgeeks.org/simplify-directory-path-unix-like/amp/
2)找到给定字符串的最长回文子串。
https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/
3) 一排有 n 个邮局。您会知道每个邮局到您家的距离。如果两地之间的距离小于或等于 x,则邮局可以将邮件发送到另一个邮局。给你 q 个查询。每个查询包含两个邮局的索引。您必须确定邮局是否可以互相投递邮件。 (预期时间复杂度 - O(n+q))
例如 -
输入:n=3, post[n] = {2, 3, 5}, x=2, q=2
查询 1:{1, 2}。输出:是(邮局 1 和 2 可以投递邮件,因为它们之间的距离小于 2)。
查询 2:{1, 3}。输出:是(虽然 1 不能直接投递给 3,但 1 可以投递邮件给 2,而 2 可以投递给 3。所以,1 可以间接投递邮件给 3)。
问题并不难,但在线编译器有点不同。例如,函数中的输入不是字符串和数组,而是指针作为输入。在第三个问题中,查询输入以双指针的形式给出。有的同学对指针的处理不熟悉,无法完全解决问题。
本轮结束后,共有75人入围组飞轮。
第二轮(团体飞轮):
我们必须在 60 分钟内解决 2 个问题。我们必须将代码写在纸上并提交。
问题一:
找到最多具有 k 个不同元素的最长连续子数组。
https://www.geeksforgeeks.org/longest-subarray-not-k-distinct-elements/
问题2:
假设一个包含 n 个元素的数组。我们定义了一个新的排序,我们将数组分成两个相等的部分,并检查其中任何一个部分是否已排序。我们继续这个过程,直到我们得到一个排序的子数组。找到已排序子数组的最大长度。
例子 -
输入:n = 6, arr[] = {7, 10, 9, 8, 11, 3}
输出:2 {7, 10} 或 {8, 11}
解释:由于数组没有排序,我们将数组分为{7,10,9}和{8,11,3}。我们再次将第一个数组划分为 {7, 10} 和 {9}。因此,最大排序子数组是 {7, 10},其长度为 2。
本轮结束后,18人被选中进行面试。
第三轮(第一轮面试):
每轮面试持续约 30-40 分钟。面试官先问了我自己,然后问了我的项目。然后,他问了我2个问题。对于这两个问题,他都问了我时间复杂度和空间复杂度,在他对方法感到满意后,他让我在纸上写代码。
1) 给定一个数组,求最长正弦子数组的长度。 (正弦子数组意味着元素应该以递增 - 递减 - 递增的方式,反之亦然)。
我的方法是设置一个增加/减少的标志,然后检查是否满足正弦条件。如果是,则增加计数并更改标志,否则,在更新 maxCount 后将计数设置为 0。时间复杂度 - O(n),空间复杂度 - O(1)
2) 求图的连通分量数。 (标准 BFS/DFS 方法)
https://www.geeksforgeeks.org/connected-components-in-an-undirected-graph/
第四轮(第二轮面试):
1) 给定一个数组,从数组中选出总和最大的 k 个元素。我们讨论了具有不同时间复杂度的这个问题的许多方法。一些方法是排序(O(nlogn)),最大堆(O(nlogn)),dp(O(nk)),递归(O(2 ^ n)),找到k个最大元素(O(nk))。
2)给定一个数字金字塔,找到从根到最后一层的最小路径值。
例如-
1
2 3
5 4 6
最小路径 – 7 (1-2-4)
我们为此讨论了 dp 方法。
dp[i][j] = max (dp[i-1][j], dp[i-1][j-1]) + arr[i][j] 其中 i 是级别索引,j 是该级别的元素索引。 (请记住为所有 dp 问题编写基本案例和极端案例)。
第五轮(第三轮面试):
1) 给定一个整数数组,选择两个差值最小的数。首先,我给了他一个排序解决方案,您可以对数组进行排序并找到相邻元素之间的最小差异。然后,他让我不分拣就去做。我首先给了他一个 O(n^2) 的蛮力解决方案,但是当他要求我进一步优化它时,我无法这样做。
2)店主出售卢比的物品。 5. 想购买商品的顾客络绎不绝。客户有任何卢比的笔记。 5,卢比。 10或卢比。 20.我们要找出店主在什么条件下不能卖更多的东西,并找出他在每一个条件下所赚取的利润。
例如 - customers[] = {5, 10, 10, ....}。对于这种情况,在第 2 位顾客之后,店主将无法退回 Rs 的零钱。 5给第三位客户,因为他只有卢比。 10 和他一起注意。因此,业务停止,利润为卢比。 10.
在这个问题之后,他要求我将问题概括为包括卢比。 1,卢比。 2,卢比。 50,卢比。 100等笔记。他问我这个系统将如何在现实生活中实施,因为有这么多类型的面额和这么多不同价格的产品类型。
之后,他还问了我一些基本的 OOP 问题,比如 OOP 的 4 个支柱是什么,并分别描述了它们。
第6轮(人力资源轮);
这一轮是最简单的,对我来说只持续了大约 10 分钟。面试官问了我同样的基本问题,以及我为什么想加入微软。然后,他问了我关于 DSA 的两个基本问题:
1)给定一个包含许多单词的句子,反转字符串中的单词。
https://www.geeksforgeeks.org/reverse-words-in-a-given-string/
2) 求 BST 中任意两个节点的 LCA。
https://www.geeksforgeeks.org/lowest-common-ancestor-in-a-binary-search-tree/
每一轮面试结束后,面试官都会问我有没有什么问题要问他。我问他们如果我得到实习,在来之前我需要培养哪些技能。
整个体验有点累,因为从早上 9 点开始的采访一直持续到晚上 9 点。但是,这是一次很棒的经历,因为面试官非常友好,给了我足够的时间来思考解决方案。要记住的重要一点是,即使您不知道完整的解决方案,您也必须与面试官保持沟通,因为他通常会帮助您走上正确的道路并引导您找到解决方案。
结果是在晚上出来的,我是被选中的 10 个人之一。在这10个人中,也有一些女孩参加了微软组织的Codess项目,因此直接进入面试,没有进行编码测试,也没有小组飞行。
我建议从 geeksforgeeks 和 interviewbit 练习(仅在涵盖 geeksforgeeks 的基础知识之后),因为他们有大量的问题,几乎涵盖了所有主题的所有子主题。此外,在任何面试之前,请仔细阅读人们在此处提供的实习经历,以便您了解公司在面试中提出的问题类型。
此外,即使他们没有就这些主题问我太多问题,我还是建议修改 OOP 和 DBMS 的概念,因为很多公司在面试时都会从这些主题中提问。
谢谢!