📜  亚马逊面试体验(SDE实习生)

📅  最后修改于: 2021-11-10 06:30:14             🧑  作者: Mango

亚马逊最近(2019 年 11 月)访问了我们的校园,招聘 SDE 实习生。这是一个三轮招聘过程。

第 1 轮(在线编码轮):

这是在mettl 平台上进行的在线编码回合。我们有 90 分钟的时间来解决 2 个编码问题和 28 个 mcq。

mcqs 完全基于数据结构和算法以及在给定的 c/c++ 片段中查找错误/输出,没有负面标记。

我的编码问题是,

  1. 这是一个基于字符串操作的简单问题,你只需要注意极端情况,否则就是小菜一碟。
  2. 第二个问题是使用输入字符串给定的相同数字找到下一个更大的数字。对输入字符串长度的约束是 1<=length<=100000,所以 O(NLogN) 解决方案会很好。
    例子
    输入:1532
    输出:2135

我不确定,但是,完全解决了编码问题并且在 mcqs 中表现出色的学生被选为下一轮。这一轮的结果在一周后公布。接下来的两轮是在一周的结果之后。

第二轮(F2F面试):

这一轮是f2f个人面试,每位候选人近1小时。

首先他介绍了他的背景和他目前在亚马逊作为 SDE 的工作,然后我被告知要自我介绍。之后,他开始了采访。

首先,当我提到我的暑期实习时,他浏览了我的简历,他询问了我在那里的工作以及我处理的申请。他很友好,似乎对我说的一切都很感兴趣。然后他看了我的项目,发现我的一个项目很有趣,所以他让我在纸上展示逻辑和计算,我解释了大约 10 分钟,他对答案深信不疑,然后我们转向了数据结构和算法题。

  1. 把这个故事放在一边,这个问题基本上是在平衡二叉搜索树中找到两个总和为给定值的节点。我建议采用中序遍历并获得排序数组的方法。然后应用这两个指针 O(N) 时间方法,因为数组已经被排序。他问我是否可以将空间复杂度而不是 O(N) 提高到更好的程度?我告诉他一种方法来维护堆栈,一个用于中序遍历,另一个用于反向中序遍历,并执行相同的双指针方法,因为一个堆栈会按升序给出数组元素,另一个会按降序给出数组元素。我不确定这种遍历的迭代植入,所以他说这很好,并告诉我编写第一种方法。他彻底审查了代码,在我对代码进行了一些解释后,他感到满意并继续下一个问题。
  2. 他让我设计一个数据结构,以最好的方式支持插入、搜索和删除操作。如果我可以改进删除时间复杂度,我建议使用带有哈希图的双向链表,而不是他说的。然后我建议自平衡 BST(AVL 树),它将在 O(LogN) 时间内支持所有这些。他被说服了,并告诉我展示我将如何平衡这棵树?我告诉他每次插入和删除操作后要执行的轮换。我不必对此进行编码。在这之后他说如果我有什么问题要问他,我问了几个一般性问题,然后回合结束了。

这一轮的结果是在所有候选人完成整个一轮大约一个小时后宣布的。

第三轮(F2F面试):

这一轮也是基于数据结构和算法,持续了一个多小时。

  1. 第一个问题是,我得到了一个非负整数数组,其中每个整数代表我可以从该位置进行的最大跳跃次数,我必须找到到达第 n 步的方法数。其中 n 是数组的长度。我向他推荐了一个 DP 解决方案,我使用了一个数组 count[n],它存储了到达该特定步骤的方法数,并让输入数组作为步骤 [n]。
    • 关系是,
      计数[0] = 1; (因为有一种方法可以到达那里,而我们已经通过这种方式到达了那里!)
      对于从 1 到 n 的每个 i
      count[min(i+1, n-1)] 到 count[min(i+steps[i], n-1)] 将增加 count[i] 因为到达这里的方法是 count[i] 和我们可以从这里上升到步骤 [i]。

    他对这个解决方案深信不疑,并告诉我写一个没有任何错误的工作代码。

  2. 第二个问题是关于通过一次将两个部分连接起来并最终以最低成本将它们合并为一条绳索来连接绳索的各个部分,其中成本定义为我们选择连接的两条绳索的总和。我告诉他使用优先队列的贪婪方法,从优先队列中取出两个最小长度的片段,然后将合并的片段再次添加到优先队列中,直到有一条绳子。然后他问我如何实现优先队列?我告诉他我将使用最小堆。然后他问我关于在最小堆中插入和删除的问题,之后我们转到下一个问题,我不必编写这个问题。
  3. 第三个问题是,我得到了一个 n 元树,每个节点都有一个整数值,我必须找到一个具有最大和的节点子集,但我不能在集合中同时包含父节点和子节点(即我必须至少排除其中任何一个)。这个问题类似于我之前解决的这个问题。所以我建议通过在 Node 类中获取两个额外的属性(即包括这个节点和不包括这个节点的最大总和),而不是对树进行级别顺序遍历并改变第 N 个级别的包括和排除变量的值,同时在第(N-1)th.(即在将它们插入队列时,我们必须考虑当前节点的所有子节点。根节点被初始化为排除为零并包含为值该节点的)最后取所有叶节点的max(包括,不包括)的总和。然后他告诉我编写包含所有极端情况的工作代码。他还告诉我要编写 Node 类。

在这三个问题之后,他问了我关于我的实习和项目的情况,当条件不断出现时,他问了我各种问题,

  • 什么是反应?
  • 什么是基于组件的开发?
  • SQL 和 NO-SQL 数据库有什么区别?
  • 什么是 AWS?等等。

最后他问我有没有什么问题要问他,然后一轮就结束了。

在这轮比赛进行了大约两个小时后,结果公布了,我和其他 6 名学生被选中。

我建议在那里时要自信并大声思考,并通过在纸上举例来表达您的想法,并在有疑问的地方提出问题。祝你面试顺利!