亚马逊面试经历|设置 414(用于 SDET-1)
我通过员工推荐申请 SDET-1 职位。我在亚马逊金奈(SP Infocity)接受了面试。我面对了 5 轮面试。
10月11日,我面临第一轮,主要是解决问题和编码。
嘿极客!是时候成为一个成功的故事而不是阅读它们了。查看我们最著名的DSA 自定进度课程, 现在以学生友好的价格为行业做好准备。如果您正在寻找更完整的面试准备资源,请查看 完整的面试准备课程 这将使您为梦想中的 SDE 角色做好准备!
为你的面试做好充分准备了吗?通过我们的测试系列测试您的技能,这将帮助您为亚马逊、微软、TCS、Wipro、谷歌等顶级公司做好准备!
第 1 轮:问题解决和编码轮(1 小时)
面试官刚开始问了一个正式的自我介绍问题。然后她问了我最后一年的项目,我清楚地解释并在白板上勾勒了它。
然后她问了我两个编码问题。
- 模拟安卓模式锁。
- 生成可以用给定模式形成的所有单词。键盘规格是手机键盘,我解释清楚
如果给定的输入是 2 3 6。
2 对应于 abc。 3对应于def。 6 对应于 mno。
假设如果我们必须生成 2,3,6 的所有组合,输出应该是一组字符串
adm,adn,ad0,bdm,bdn,bd0,.....
我给出了一个递归和迭代的解决方案来打印组合。
然后面试官稍微修改了问题。她让我用字典验证生成的字符串。
我给出了两种维护字典的方法。首先,我提出了一种哈希表方法,它的插入删除和搜索操作的平均时间复杂度为 O(1)。
然后,由于生成的字符串具有公共前缀,我建议使用字典的 trie 方法。
面试官对我的解决方案很满意,并要求我完整地编写解决方案。
几天后,我进行了 2 次面对面的回合。
第 2 轮:测试和自动化轮(1 小时)
面试官刚开始问我之前是否了解测试和测试环境,我回答没有。然后我们讨论了测试的类型和不同的阶段以及与之相关的测试程序。然后她问了我两个简单的测试用例生成问题。
- 为 add函数生成所有可能的测试用例,该函数将两个字符串作为输入并返回一个整数,该整数是作为字符串输入给出的两个数字的总和。
我为这个问题提供了大约 10 个测试用例,因为它非常简单。我使用 JUnit 测试编写了一些代码,这非常简单。
2. 在编辑器中给定一个打开的文件模块,打开文件模块可能出错的可能情况是什么。
我列出了一个案例清单,我们清楚地讨论了每个案例的来龙去脉。
这一轮很容易,因为我前一天准备了测试部分。
第 3 轮:数据结构和算法轮(1 小时 15 分钟)
这一轮有两个人采访了我。我们刚开始正式介绍。然后他们问了我两个问题。
- 骑士行走问题。
给定一个*n 棋盘和一个放置在任何一个角落的骑士,生成所有可能的路径,骑士可以通过这些路径覆盖所有的方格。
我从使用 BFS 的方法开始。但是我的方法有一个缺陷,那就是如果之前已经探索了骑士可以从给定点出发的所有可能点,那么骑士将无法逃离单元格。
然后我使用回溯给出了一个解决方案。
从一个角落开始。对于骑士可以到达的每一个可能的点,使用简单的 for 循环对那些点进行递归调用。一旦计数达到 n*n(例如在 8*8 棋盘中,如果计数为 64),打印找出可以在数组中轻松维护的遍历路径。这解决了我之前方法中的缺陷,因为如果到达死路,我们可以回到另一种可能性。
面试官对我的方法很满意,并要求我编写解决方案。我对它进行了编码,然后我们继续下一个问题。
2. 给定一个链表,找出在一个公共点收敛的两个链表的交点。
我首先给出了一个蛮力 O(n^2) 方法,然后将其优化为 O(n) 时间和 O(n) 空间方法。然后我最终通过找到 O(n) 时间 O(1) 空间解决方案两个列表长度的绝对差异。然后他们让我编写非常简单的解决方案。
在此之后,我在 10 月 31 日进行了最后两轮比赛。
第 4 轮:招聘经理轮(1 小时)
面试官让我简单介绍一下自己。然后我们在前几分钟确定了我的项目,然后面试官问了我之前参加过的面试以及过程是如何进行的。然后他开始询问测试以及与某些给定场景相对应的测试的使用。经过几分钟的讨论,他问了两个关于数据结构的问题。
- 给定一个整数数组,打印加起来等于给定总和的对。
我首先给出了一个 O(nlogn) 方法来找到对并打印它们。该方法是对数组进行排序并保留左右两个索引(在每一端),并查找加起来是否为给定总和的对,并打印它们直到左右指针交叉。
然后他问我是否可以进一步优化它。我使用散列给出了一个 O(n) 方法。我维护了一个整数散列集。将第一个数字放入哈希集中,从第二个元素开始,对于数组中的每个数字,检查哈希集中是否存在(给定总和 - 当前元素)。如果是这样打印对。
2. 给定一个二叉树,打印它的底视图。
经过几分钟的思考,我想出了一种方法,即使用节点与根的水平距离。在使用水平顺序遍历进行遍历时,我们必须注意特定水平距离处的最后一个节点。我使用 Hashtable 来存储每个水平距离上最后访问的节点。
这种方法使用 O(n) 时间和 O(n) 空间。
然后他问了一个谜题。
在一个有 30 人的房间里,假设房间里的每个人都应该与每个人握手,找到唯一的握手次数。
我只是用了一个简单的逻辑。在一个 2 人的房间里,只有一次独特的握手(第一人有 1 次独特的握手,而第二人没有)。如果我们考虑三个人,n = 3 (A,B,C)
A 有两次独特的握手 B,C.(n-1 次握手)
B 有 1 次独特的握手 C.(n-2 次握手)
C 没有任何独特的握手。
握手总数 = n-1 + n-2 = 2n-3 = 3.(前两个自然数之和)
同样,对于 n 个人,唯一的握手将是前 n-1 个自然数的总和。
对于 n = 30,唯一握手的总数为 29*30/2 = 29*15 = 435。
这是一个包装。他对我接近解决方案的方式感到满意。
他问我有没有什么问题要问他。我询问了亚马逊的文化和工作环境。
第 5 轮:酒吧提升轮(1 小时)
两名成员进入房间并自我介绍,我们刚刚开始介绍我的项目。
他们问我在当前一轮之前我有多少轮。他们一开始只是问了几个关于测试的问题。然后他们问了两个编码问题。
- 给定一棵二叉树,打印其中的第 K 个最大元素。
我只是通过查找树的中序遍历立即开始使用蛮力解决方案。然后对数组进行排序并找到排序数组中最大的第 k 个,即从数组的起始索引开始的第 (nk) 个元素,其中 n 是树中节点的总数。这使用 O(nlogn) 时间和 O(n) 空间。
他们让我进一步优化它。
我通过将二叉树转换为双向链表,然后在可以在 O(nlogn) 时间内完成的双向链表中找到第 k 个最大的,给出了 O(nlogn) 时间和 O(1) 空间的解决方案。
但是有一个更好的解决方案,我在面试中想不到。只需构造一个 k 个元素的最小堆,通过使用任意遍历遍历树将元素插入堆中。
如果堆根元素小于树中的当前节点,则从堆中删除根元素并将新元素插入堆中。最后,在完全遍历树之后,第 k 个最大元素将位于堆的根部。这使用 O(nlogk) 时间和 O(k) 空间。
但是他们对我的方法很满意,因为他们说我要按空间或时间对其进行优化。我给了一个恒定的空间方法,所以他们很满意。
2.给定一个有向图,判断是否存在环,如果存在则打印。
我给出了一个使用 BFS 的解决方案。我将一个节点放入队列中,然后添加了可以从当前节点到达的所有可能节点。当我们遍历节点时,我们只是在哈希图中将节点标记为已访问,以避免节点之间的无限循环。他们对我的做法很满意。
最后他们问了 HashMap 是如何实现的以及它是如何工作的(特别是如何计算 hashcode 和 index)。我设计了自己的哈希函数并解释了 get 和 put 函数在哈希图中的工作方式。他们对我的解释很满意,然后他们问你如何在发生冲突的情况下修改你的哈希函数,并简要讨论了冲突处理技术。
他们问我是否有任何问题要问他们。我只是问了我上一轮问的同样问题。
PS:每一道题我们都要写清楚代码。不要直接进入编码部分,要清楚地解释你的方法。要有信心,他们不想要问题的优化解决方案,他们会看到候选人如何解决问题。