微软面试经历 |设置 138(校外)
大家好,我最近在微软接受了一个特定团队的采访。我通过推荐获得了这个机会。
大约有 30 人来参加面试过程,有些是有经验的,有些是像我这样的新人。由于大约有 30 人,因此没有采取书面轮次或集体飞行。
现在进入面试过程,我经历了4轮,每轮都是淘汰赛。
第 1 轮(50 分钟):
- 求二叉树的最大宽度。
假设任意节点在第k层(根的层级为0),那么右孩子的层级为k+1,左孩子的层级为k-1。所以最大宽度计算为maxLevel - minLevel。
前任 -1 / \ 2 3 / \ \ 4 5 8 / \ 6 7
这里 maxLevel 为 3(节点 7),minLevel 为 -2(节点 4)。所以最大宽度是 3-(-2) = 5。
最初,我在函数调用中使用了一些参数。然后面试官告诉我不要使用除节点的root和currentLevel之外的任何额外参数。我就这样做了。然后他告诉我每个节点和每个节点都有一个字段 maxWidth,作为根,我需要将子树的最大宽度存储在字段 maxWidth 中。 - 之后,他给了我一段Java代码,并就该代码向我提出了一些与 OOPS 概念相关的问题。
第 2 轮(75 分钟):
- 求二叉树最长路径中出现的节点的总和。
我使用参数来跟踪找到的当前最大路径长度及其总和。每当我发现路径长度大于当前最大路径长度时,我都会更新最大路径长度和总和。在此之后,他修改了问题,并告诉我处理乘积、异或等多个操作的代码。由于我使用函数参数来跟踪求和,因此为每个操作获取一个参数是不可行的。因此,我为每个操作创建了一个包含字段的类,并将该对象用作参数。 - 对包含 0、1 和 2 的数组进行排序。
第三轮(60分钟):
- 面试官问了我在大学里做过的事情,并据此让我设计一个在线编码评委(比如 codechef)。他让我使用类来实现它。他问我如何有效地处理用不同编程语言编写的代码等。关于这个问题发生了很多讨论。
- 他让我设计文本编辑器的撤消和重做功能。
第 4 轮(50 分钟):
- 给定一棵二叉树,检查它是否是 BST。
- 面试官让我设计一个搜索引擎。搜索引擎必须在文档集合中搜索标记,并且应该能够找到标记存在的文档以及标记出现的频率和标记在文档中的位置(索引)。他让我编写完整的工作代码,我使用 trie 数据结构来完成。