第 1 轮(在线评估):这一轮通常包括两个编码问题,您必须编写代码并在单独的窗口中给出正确的解释。本轮时间约1小时
问的问题是:
- 对主要和非主要订单的订单列表进行排序 (https://leetcode.com/discuss/interview-question/1261316/amazon-oa-sde-1-new-grad-2021-batch-india)。我通过简单地将我的自定义比较器传递给标准排序函数来做到这一点。这很容易,但它有一些边缘情况,这花了我一些时间。
- 优化内存使用(https://leetcode.com/discuss/interview-question/373202)
在此之后,您将不得不做一些行为 MCQ 类型的问题。
在接下来的所有轮次中,我都被问到行为和编码问题,因此我将尝试将它们都包括在内。
第二轮:这一轮从我的介绍和当前项目开始。在这位面试官询问了我什么时候不得不做一些意想不到的复杂工作以及我如何处理这种情况之后。
编码问题:
- 给定一棵二叉树,计算所有左叶的总和:
- 实现 LRU 缓存。面试官故意只引用“实现LRU缓存”来模糊这个问题,因此我问了很多澄清问题,并使用双向链表和哈希图慢慢找到了最佳解决方案。
第三轮:这一轮也是从我的介绍和目前的工作开始。
编码问题:
- 计算以字符串形式给出的算术表达式,该表达式将仅包含数字和四个操作 +、-、*、/
Input: "3*2+5" Output: 11
我决定使用两个堆栈来解决这个问题,并使用规则将所有算术运算运算符和数字存储在不同的堆栈中:
“不能将低优先级运算符推到高优先级运算符”
“当一个运算符被弹出时,两个数字也会从另一个堆栈中弹出”
所以我的算法基本上是这样的:
- 启动两个堆栈作为operatorStack和operationandStack
- 扫描表达式
- 如果找到一个数字,将其推入操作数堆栈
- 如果找到运算符并且运算符的顶部具有比当前运算符低的优先级,则推入 operatorStack
- 如果找到运算符并且运算符的顶部具有比当前运算符高的优先级,则继续从运算符弹出运算符,直到顶部的优先级低于或等于当前运算符。随着每个运算符弹出,您必须从操作数堆栈中弹出两个数字,并对这两个数字应用弹出的运算符并将结果推回到操作数堆栈上,如下所示:
op = operatorStack.pop() number2 = operandStack.pop() number1 = operandStack.pop() operandStack.push(number1 op number2)
请注意,这里首先弹出第二个数字。
- 表达式扫描后,按照上述规则从operatorStack中弹出剩余的运算符符
- 您的最终答案将是操作数堆栈的顶部。
还有一种更简单的方法,将中缀表达式转换为后缀,然后用一个堆栈简单地对其进行评估。
- 计算到达数组末尾所需的最少跳转次数
我为这个问题给出了两种方法,一种 O(n^2) 和另一种 O(n)
由于剩下的时间很少(大约 15 分钟),我在解释 O(n) 方法时遇到了一些困难,但面试官被说服并要求我将其编码。
在此之后,有人问了一些与计算机科学相关的问题,例如:
- 你用过什么类型的数据库
- SQL 和 NoSql 数据库之间的区别是什么?两者都针对哪种类型的查询进行了优化?
- 线程和进程的区别
- 为什么与进程相比,线程中的通信速度更快(因为线程共享相同的内存空间)
- 什么是锁和信号量
第 4 轮:在这一轮大约 30 分钟的面试中,他询问了行为问题,他真的很想为所有人提供详细而深入的答案。我引用我记得的那些:
- 您处理过的一个复杂功能,您面临哪些挑战,您是如何处理这些挑战的
- 当您面临紧迫而严格的最后期限时,您是如何满足它们的
- 你是如何学习你正在研究的技术的,你采取了哪些步骤?
- 你是如何提高自己的?等等
- 在接下来的 30 分钟里,他提出了这个编码问题:从一个数组中找出一对数字,其总和最接近于零。为此,我使用了排序和两个指针的方法
第五轮:这一轮又是30分钟左右的行为问题,和上一轮一样,他也想要详细而深入的答案
编码问题:
- 两个链表的交集:我为此给出了两种方法:第一种:使用两个 for 循环,第二种:使用 hashmap
- 对称二叉树我通过对根的子节点进行并行 dfs 并比较每个级别的节点来解决它。
一些技巧:
- 如果第一个问题很容易,不要试图花太多时间解释第一个问题,因为通常面试还想问第二个问题,因此你将没有多少时间来解释和编码第二个问题。
- 在所有行为问题中都要诚实,因为他们会针对你的答案提出许多反问,如果你编造出来,它肯定会在某个时候崩溃。