📜  亚马逊面试经历|设置 414(用于 SDET-1)

📅  最后修改于: 2022-05-13 01:57:00.844000             🧑  作者: Mango

亚马逊面试经历|设置 414(用于 SDET-1)

我通过员工推荐申请 SDET-1 职位。我在亚马逊金奈(SP Infocity)接受了面试。我面对了 5 轮面试。

10月11日,我面临第一轮,主要是解决问题和编码。

嘿极客!是时候成为一个成功的故事而不是阅读它们了。查看我们最著名的DSA 自定进度课程现在以学生友好的价格为行业做好准备。如果您正在寻找更完整的面试准备资源,请查看 完整的面试准备课程  这将使您为梦想中的 SDE 角色做好准备!

为你的面试做好充分准备了吗?通过我们的测试系列测试您的技能,这将帮助您为亚马逊、微软、TCS、Wipro、谷歌等顶级公司做好准备!

第 1 轮:问题解决和编码轮(1 小时)



面试官刚开始问了一个正式的自我介绍问题。然后她问了我最后一年的项目,我清楚地解释并在白板上勾勒了它。

然后她问了我两个编码问题。

  1. 模拟安卓模式锁。
  2. 生成可以用给定模式形成的所有单词。键盘规格是手机键盘,我解释清楚

如果给定的输入是 2 3 6。

2 对应于 abc。 3对应于def。 6 对应于 mno。

假设如果我们必须生成 2,3,6 的所有组合,输出应该是一组字符串

adm,adn,ad0,bdm,bdn,bd0,.....

我给出了一个递归和迭代的解决方案来打印组合。

然后面试官稍微修改了问题。她让我用字典验证生成的字符串。



我给出了两种维护字典的方法。首先,我提出了一种哈希表方法,它的插入删除和搜索操作的平均时间复杂度为 O(1)。

然后,由于生成的字符串具有公共前缀,我建议使用字典的 trie 方法。

面试官对我的解决方案很满意,并要求我完整地编写解决方案。

几天后,我进行了 2 次面对面的回合。

第 2 轮:测试和自动化轮(1 小时)

面试官刚开始问我之前是否了解测试和测试环境,我回答没有。然后我们讨论了测试的类型和不同的阶段以及与之相关的测试程序。然后她问了我两个简单的测试用例生成问题。

  1. 为 add函数生成所有可能的测试用例,该函数将两个字符串作为输入并返回一个整数,该整数是作为字符串输入给出的两个数字的总和。

我为这个问题提供了大约 10 个测试用例,因为它非常简单。我使用 JUnit 测试编写了一些代码,这非常简单。

2. 在编辑器中给定一个打开的文件模块,打开文件模块可能出错的可能情况是什么。

我列出了一个案例清单,我们清楚地讨论了每个案例的来龙去脉。

这一轮很容易,因为我前一天准备了测试部分。



第 3 轮:数据结构和算法轮(1 小时 15 分钟)

这一轮有两个人采访了我。我们刚开始正式介绍。然后他们问了我两个问题。

  1. 骑士行走问题。

给定一个*n 棋盘和一个放置在任何一个角落的骑士,生成所有可能的路径,骑士可以通过这些路径覆盖所有的方格。

我从使用 BFS 的方法开始。但是我的方法有一个缺陷,那就是如果之前已经探索了骑士可以从给定点出发的所有可能点,那么骑士将无法逃离单元格。

然后我使用回溯给出了一个解决方案。

从一个角落开始。对于骑士可以到达的每一个可能的点,使用简单的 for 循环对那些点进行递归调用。一旦计数达到 n*n(例如在 8*8 棋盘中,如果计数为 64),打印找出可以在数组中轻松维护的遍历路径。这解决了我之前方法中的缺陷,因为如果到达死路,我们可以回到另一种可能性。

面试官对我的方法很满意,并要求我编写解决方案。我对它进行了编码,然后我们继续下一个问题。

2. 给定一个链表,找出在一个公共点收敛的两个链表的交点。

我首先给出了一个蛮力 O(n^2) 方法,然后将其优化为 O(n) 时间和 O(n) 空间方法。然后我最终通过找到 O(n) 时间 O(1) 空间解决方案两个列表长度的绝对差异。然后他们让我编写非常简单的解决方案。

在此之后,我在 10 月 31 日进行了最后两轮比赛。



第 4 轮:招聘经理轮(1 小时)

面试官让我简单介绍一下自己。然后我们在前几分钟确定了我的项目,然后面试官问了我之前参加过的面试以及过程是如何进行的。然后他开始询问测试以及与某些给定场景相对应的测试的使用。经过几分钟的讨论,他问了两个关于数据结构的问题。

  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 小时)

两名成员进入房间并自我介绍,我们刚刚开始介绍我的项目。

他们问我在当前一轮之前我有多少轮。他们一开始只是问了几个关于测试的问题。然后他们问了两个编码问题。

  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:每一道题我们都要写清楚代码。不要直接进入编码部分,要清楚地解释你的方法。要有信心,他们不想要问题的优化解决方案,他们会看到候选人如何解决问题。