第 1 轮(入围):有三个编码问题。难度为简单中等。第一个问题是在地图上,第二个问题是关于硬币找零问题,但用质数而不是硬币价值,第三个问题是从去年开始重复的。
面试回合(2020 年 12 月):我进行了一次面试。面试官来自雷德蒙德,有 22 年的经验。他问了我一个问题:
- 给定一个未排序的数组,找到其中的二分可搜索元素。二分搜索适用于已排序的数组,因为中间元素始终大于其左侧的所有元素并小于其右侧的所有元素(对于具有不同元素的数组)。因此,找到 leftmax 和 rightmin 数组以及在 leftmax 和 rightmin 与数组元素重合的位置上的元素将给出二进制可搜索元素。
经验和思考过程:我很幸运有一位面试官在解释问题时非常冷静。他给了我一个codility链接,这是微软通常会提问的平台。我问他一些关于数字范围、数组中元素数量以及它们是否可以为负的说明。我继续给他一个简单的解决方案,告诉他它的时间和空间复杂性。然后他告诉我他想要一个 O(n) 的解决方案。这是当我打开一个记事本窗口并在团队中分享时(面试是虚拟的)。在考虑解决方案时,我确保我说出了我想到的所有内容。这样,如果我的思绪转向错误的方向,他就会阻止我。我从二分搜索的工作原理开始,因为这是我第一次遇到这个问题,所以我尝试在开始时尽可能地基本。我试着告诉他当分区(中间元素)处于正确位置时可以搜索元素。当我谈论它时,我正在记事本上输入所有这些。然后我举了一个例子,向他展示了它是如何工作的,为给定的数组制作单独的行,leftmax 和 rightmin,以及一个代表可搜索元素的 bool 数组。在这一点上,他对我的思维过程和我构建解决方案的结构印象深刻。我告诉他现在我会在平台上编码。他们也想要干净的代码,所以我从输入开始,用好的变量名定义数组,而不仅仅是“A”或“arr”。命名帮助我忽略了注释,因为代码中的一切都很清楚。我先做了leftmax,然后是rightmin数组,最后统计元素个数。面试官告诉我他喜欢我的编码风格。我告诉他所有这些都可以在一个循环中完成,但是将三个代码设置为第一次看到它的人可以清楚地了解代码。在这之后,他告诉我不需要运行代码,因为他知道它看起来是正确的。无论如何我都运行了它,并且在第一次运行时就被接受了。
此外,他问我有没有什么问题,我问他在微软是否开心,以及是什么因素让他在一个地方工作了 22 年。他给出了一个很长的答案。当面试官说些什么时,试着表现出兴趣。在这之后,他告诉我他已经完成了面试。 7 个小时后,我直接收到了我的报价。总的来说,这是一次非常积极的体验。
TLDR?尽可能清楚地告诉面试官你的思考过程和你解决问题的方法是很重要的。解决是不够的。
准备: 2020年8月之前没做过一道编码题,2018年7月上过基础数据结构课,仅此而已。我开始编码,首先是GeeksforGeeks ,然后是leetcode和Interviewbit 。第一个月是一团糟。第一周我一个问题都答不出来。我从简单的问题开始,然后是中等,然后是困难级别的问题。即使在第一个月之后,我也只能做一些简单的问题。我继续编码,一开始就寻找大多数问题的解决方案。我从 GFG 上最重要的“必须做”的问题开始,完成了所有这些,做了更多,然后切换到 leetcode。我能够解决一些简单的问题,一些中等的问题,但即使在 2 个月之后,困难的问题仍然具有挑战性。第三个月,我全力以赴,从早到晚编码。我试图在 leetcode 的讨论部分和 GFG 的评论中思考其他人处理类似问题的方式。慢慢地,我可以看到自己越来越擅长解决。我更喜欢 C++。 CSE 的朋友帮了我很多。我曾经问过每一个我无法理解的小事情,再次阅读数据结构,并一遍又一遍地寻找解决方案,直到我能够自己解决问题。最后,从 8 月到 11 月,我总共解决了大约 800 个问题,其中许多问题超过了两次。