亚马逊面试体验(SDE-1 校园内)
亚马逊于 2019 年访问 JIIT Noida 进行校园流程。
第 1 轮(在线编码轮 - HackerEarth 上的 90 分钟):
这一轮包括 2 个编码问题和 20 个 MCQ。编码问题的难度级别很简单,MCQ 测试了 CS 基础知识(OS、DBMS、CN、OOPS 等)。
编码问题是:
- 给定一个整数 N。你有无限数量的 3、5 和 10 面额的硬币。用硬币面额打印出 N 的总和的方法数。 Soln:标准 DP 硬币找零问题。
- 给定一家公司 N 天的利润和 Q 次查询。每个查询包含两个整数 L 和 R。对于每个查询,打印利润大于或等于 L 且小于或等于 R 的天数。Soln:对利润进行排序,对于每个查询,使用二进制搜索以找到 R 的上限和 L 的下限。时间复杂度:O(nlogn + Qlogn)
我记得的一些 MCQ:
- T(n) = 4T(n/2) + n^2 的时间复杂度(选项:O(n^2)、O(nlogn) 等)
- 给定:前缀表达式。以下哪个是对应的后缀表达式。
- 计算将发生的页面错误数,给定:OS 使用 FIFO 进行页面替换,每帧的页面数。系统以特定顺序使用 x 页,然后以相反顺序使用一些 y 页。
- Ping 在网络中的用途。
- 关于 SQL 命令的一些问题(向表中添加列等)
- 在 OOP 中,以下哪项用于实现运行时多态性。选项:友元函数、运算符重载、函数重载等)
- 如果一台机器在 y 秒内对 x 个条目进行排序,那么它将在 z 秒内排序多少个条目。给定:冒泡排序用于排序。
- 给定树的后序遍历,以下哪个是有序的。
- 关于死锁、信号量等的问题
- 具有 N 个叶子的完全二叉树中的节点数。
- 虽然问题很简单,但门槛很高。在大约 400 名学生中,有 30 人能够通过这一轮。
第 2 轮(面对面面试 - 1 小时):
面试官非常友好,一开始是“告诉我你的项目”。这听起来像是一种形式,我做了一个非常简短的回答,然后他开始提问。
Q1:打印数组中的所有三元组,总和为给定数 k。这里的问题是必须打印所有这样的三胞胎。例如,如果给定数组是 {1, 1, 1, 1, 2, 0} 且 k = 3,则输出应为:{(1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 2, 0), (1, 2, 0), (1, 2, 0), (1, 2, 0), (1, 2, 0)}
我开始思考,并在思考的同时向面试官解释我的思考过程。首先,我谈到了对给定数组进行排序,然后对于数组中的每个元素 A[i],我找到了总和为 kA[i] 的所有对。为了找到这些对,我将一个指针固定在 A[i+1] 上,一个指针固定在 A[n-1] 上(如果 n 是数组的大小)。我不得不修改解决方案,以便打印所有可能的配对,而面试官本人为此给出了 2-3 条提示。
时间复杂度:O(nlogn + n^2) = O(n^2)
额外空间:O(1)
然后他让我编写解决方案,我这样做了,并在进行试运行后提交了解决方案。面试官告诉我重新检查我的代码。我分析了它,一个案例丢失了,我添加了它,然后他被说服了。
Q2:给定一个数组,其中对于所有 i,A[i+1] = A[i] + 1 或 A[i] – 1。在这样的数组中,找到一个数 k。
答:可以使用线性搜索在 O(n) 内完成。但它可以通过执行跳转来优化。例如,如果 k = 10 并且第一个元素是 5,我们可以跳转 4 个元素,因为第 4个元素最多可以是 9。等等……
然后面试官修改了问题。现在,A[i+1] = 在 {A[i] –t, A[i]+t} 范围内。
Ans:跳跃的大小将被修改。
然后他让我编写我所做的解决方案。
每个问题我用了大约 30 分钟,在面试官的提示下,我逐渐找到了答案。这听起来可能违反直觉,但面试官给出提示是一个积极的信号(只要你能够捕捉到这些提示并得出他希望你得出的解决方案)。
第 3 轮(面对面面试 - 45 分钟):
问题:实现 split-wise app 的算法(算法,不是系统设计)。给定格式的交易:A->B 45,这意味着 A 欠 B 45 卢比。将交易减少到最低限度。
我从绘制事务图表开始,我认为如果我们检测图表中的所有周期,那么我们可以在每个周期减少一个事务。面试官让我编写代码,我开始这样做。然后他在中间阻止了我,并告诉我想出一个不同的解决方案。他给了我一个提示,让我考虑一下每个人欠/被欠的净金额。使用这个提示,我想出了一个贪婪的解决方案:形成两组人,欠一些净额的人和被欠的人。然后从欠的人中,选择一个,从欠的人中给一个。但我不确定必须选择两组元素的顺序。他暗示我选择具有最大价值的那些。我试图在数学上证明它,然后继续解决。然后我使用 max-heaps 从两个集合中提取元素。
时间复杂度:O(nlogn)
额外空间:O(n)
然后他让我编写解决方案。在解决方案中,我使用 heapify 和 percolate-up 作为堆函数,他也让我编写了它们。
第 4 轮(面对面面试 - 1 小时):
问题:给定一个 BST,找到第 k 个最大的元素。未给出 BST 的大小。
答:使用逆序遍历。保留计数器以跟踪没有访问过的元素。
然后剩下的面试只基于项目和我的实习。我还被问到一些主观问题,例如“您从事的最具挑战性的项目是什么,为什么?”,“您最喜欢哪种技术”等。
面试官对我的项目进行了深入的提问,但由于我只提到了我自己做的简单项目,所以我自信地回答了所有问题。
第 5 轮(面对面面试 - 1 小时):
这一轮有两个面试官。这一轮他们问了很多CS Fundamentals的理论问题。我不擅长理论科目,只能部分回答问题。
一些问题是:讨论信号量以及它们是如何工作的,什么是临界区,什么是竞争条件,线程和进程之间有什么区别,什么是调度,讨论一些调度算法,解释循环的工作原理调度。什么是事务的原子属性,讨论规范化、1NF、2NF 等,什么是 DNS 服务器,两个 DNS 服务器可以相互通信,当我们键入 Web URL 时会发生什么等。
在一个问题中,我得到了一个Java代码段,并询问是否会违反临界区。
我不知道亚马逊对基础知识的期望有多少,但我只回答了其中一些问题。我能够自信地回答一些问题。对于一些问题,我只给出了部分答案,尽我所能。对于一些问题,比如循环工作、原子属性等,我根本无法回答。
到现在这一轮还不太顺利,但由于面试官非常友好,我要求他们问我一些关于 DS/Algo 的问题。然后他们让我检查两个 BST 是否相同(即具有完全相同的元素,结构可能不同)。
Soln:将两棵树的有序遍历存储在数组中,并检查两个数组是否相同。
时间复杂度:O(m+n),空间复杂度:O(m+n)
面试官告诉我优化空间,并暗示考虑其他方式进行有序遍历。然后我使用堆栈而不是递归执行了中序遍历。我保留了两个堆栈,并不断从两个堆栈中删除相同的元素,当它们出现在两个堆栈中时。并且此堆栈将最多具有 O(logn) 个元素(或 O(height) 个元素),因此降低了空间复杂度。然后我被要求编写我所做的解决方案。
建议:
- 从蛮力解决方案开始,然后尽可能长时间地对其进行优化。您最终需要达到优化的解决方案,如果您从一个非常简单的解决方案开始并逐步优化它,那是完全可以的。
- 尝试用数学方法证明你逻辑的每一部分,不要胡乱猜测。如果您形成任何假设,请不要在没有证明的情况下继续进行。
- 澄清面试官的问题,询问他一些随机测试用例的输出,以确保你正确理解了这个问题。
- 练习在纸上写代码。它与在计算机上编写非常不同,因为您无法在纸上进行太多编辑。
- 始终说明解决方案的时间和空间复杂性。
- 在将代码提交给面试官之前进行试运行。