📜  亚马逊面试体验 SDE(校园 2019)

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

亚马逊面试体验 SDE(校园 2019)

学历:目前攻读BE电气和电子工程。
第一轮:大致介绍完后,面试官问我是否擅长数组。我说“是”,然后他问我两个关于数组/向量的问题,然后问我一个关于 BST 的问题。
问题 1 :给定两个数组(A 和 B),您能否判断是否可以将 A 中的元素与 B 中的元素交换并使两个数组的总和相等?
答案:对数组进行排序。计算两个数组的总和并取出总和的差。如果差异是奇数——不可能进行所需的交换(返回 0),否则如果它是偶数——(假设差异为 8)除以 2(= 4)然后遍历两个数组(这可以是通过不同的方法完成——我使用了二进制搜索并进行了一些修改)并找到了一个差异 = 4 的对。如果找到——有可能(返回 1),否则返回 0。
:这就是我告诉他的解决方法。经过一分钟的思考,我说:“首先我们将计算两个数组的初始和,然后取出它们的差。如果差异是奇数 - 这意味着不可能通过交换两个元素来使总和相同。面试官问我为什么差异需要均匀?我告诉他,交换两个元素所产生的任何交易总是会导致总和值的增加或减少。他被说服并告诉我继续。 “因此,如果差是偶数,我们将把它除以二,然后用两个指针并行遍历两个数组。所以是的,如果我们也对数组进行排序,这样我们就可以使用二分搜索了。如果找到一对,则返回 1,否则返回 0。
他告诉我要编写相同的代码,我这样做的同时解释了我为避免现在的极端情况和条件而采取的一些假设。 (就像两个向量中都有元素,并且 A 的总和最初大于 B)。
他阅读了代码并提出了一些疑问,我很好地解释了这些疑问,他对此深信不疑。
问题 2 :https://www.geeksforgeeks.org/coin-game-of-two-corners-greedy-approach/
我告诉我确切的解决方法,他用一些例子反驳,但找不到其中的缺陷。他问如果硬币最初的数量是奇数怎么办。我告诉他那比赛会不公平,但他说让我们不公平,现在你怎么赢?我告诉他,如果现在奇数之和大于偶数,那么只有我能赢,否则我不可能在这种情况下赢。他举了一些例子进行反驳,但最终被说服了。
问题 3:给定一个 BST,用大于该节点的所有节点的总和替换每个节点。用 0 替换最大值节点。
答案:非常简单的递归方法。在提出第三个正确的解决方案之前,我曾与两个有缺陷的解决方案作斗争。
持续时间:1-1.5 小时。
结果:入选第二轮。
第 2 轮:友好且鼓舞人心的面试官。他问了我两个问题,一个是关于二叉树的,另一个是关于向量和数学的。
问题1:给定二叉树,打印左节点的最大深度。(节点需要是左孩子)(如果节点是根节点的左孩子的右孩子,那么它不会算作左节点)
我花了一些例子来理解问题所在。他自己告诉我通过询问任何例子来澄清问题,所以我采取了不同的场景并问他在这些情况下的答案是什么。他告诉我你认为答案应该是什么?我根据我对问题的理解告诉他审理案件的答案,最后得出我对问题理解正确的结论。
答:这是非常简单的递归方法。只需跟踪所有左侧节点的 maxDepth 即可。要检查节点是左子还是右子,只需在调用递归时传递一个整数参数(比如 1 代表左,2 代表右)。
函数看起来像这样(C++)

CPP
int maxD;
 
void maxD(node* root, int direction, int depth)
{
    if (!root)
        return;
 
    if (direction == 1) // left child
    {
        maxD = max(maxD, depth);
    }
 
    maxD(root->left, 1, depth + 1);
    maxD(root->right, 2, depth + 1);
}


CPP
while (j < size()) {
 
    int I = randomGenerator();
 
    // To generate a random number within
    // bounds of array. the part with j will
    // be understood later
    I = I % (size - j);
    .
 
        swap(A[j], A[I]);
 
    j++;
}


面试官对我的方法深信不疑,并迅速转向第二个问题。
问题 2 :给定一个歌曲列表和一个从 1-INT_MAX 生成任意随机数的随机数生成器,返回一个打乱的播放列表。(就地)
我的方法:歌曲列表=向量A;
int size = A.size();
诠释 j = 0; // 遍历数组

CPP

while (j < size()) {
 
    int I = randomGenerator();
 
    // To generate a random number within
    // bounds of array. the part with j will
    // be understood later
    I = I % (size - j);
    .
 
        swap(A[j], A[I]);
 
    j++;
}

面试官被我的方法说服了,但他有一些不同的方法,并一直质疑这个解决方案的稳定性,并告诉我对它进行一次试运行。这是正确的,所以他没有进一步询问。
持续时间:约 1 小时
结果:第3轮被选中。
第三轮:这是最难的一轮,面试官很严厉,也不是那么友好。他问了我两个问题,这两个问题我都无法回答,但我很挣扎,并与我的方法相距甚远。
问题 1 :给定两个数 n 和 k。可以使用 2 的“k”次方分解“n”吗?如果是,则返回一个可能的集合。
示例:n = 9,k=3 – 答案:是,4+4+1 = 9;
不,它不能通过数字的二进制转换然后在那里结合两个的幂来完成(我立即尝试过)。我无法解释工作
问题2 :给定'n'个不同大小的向量和一个整数'k',从不同的数组中找到最大可能的3个数字集合,其中max-min <= k的差异。 (一旦你找到一个三胞胎,它就不能被计入其他集合)。
这是一个复杂的问题——我使用了排序、最小堆、三指针等等。我的解决方案使用了三个嵌套循环,每个循环中都有单独的排序,并创建最小堆并每次取差,如果条件不满足或增加所有数组的指针,则最小化 max-min 的差异并增加一个数组的最小指针如果确实如此。这变得非常复杂并且 inte PASS。 rviewer 对我在写什么感到困惑。他多次向我询问它在每一步中的工作方式。有时我解释,而其他时候我也很挣扎。他问我解决方案的复杂性,我认为这有点像 O(n*m^2*log(mn)),他不相信我刚才所说的任何事情。我被烤得足以相信我在那之后就退出了这个过程。
持续时间:1.5-2 小时。
结果:入选第四轮!!! (也许他们不会仅根据您的解决方案来判断您)
第4轮:这主要是招聘经理一轮。
他让我介绍自己,我准备好的答案做得很好。
然后他问我去年是否有任何弱点或任何批评?
之后,他向我询问了我的项目和实习经历。我诚实地告诉他我所做的和知道的,当他询问与数据库等项目相关的任何事情时,我告诉他我做了这个项目并使用它的程度,并且不了解数据库的深入概念。他问我关于我在简历中提到的课外活动。
然后他问我知道的所有数据结构是什么?我告诉他我知道的每一个数据结构。我忘了提到链表,所以最后我说“是的,链表也是”,然后他告诉我他会问一个关于链表的问题。 (我不知道他是否计划过我最后说的任何数据结构都将成为问题的主题,因为从心理上讲,这将是我们的弱点😛,事实上,链表在某种程度上是我的弱点)。
这个问题很简单,也是一个很常见的面试问题——合并两个排序的链表。
我之前不知道 O(1) 空间复杂度的解决方案,所以我先处理了数组,然后他问我是否可以在 O(1) 空间中完成。因此,经过一分钟的思考,我也能够弄清楚这一点。然后我写了代码,面试官很满意。
时长:20-30 分钟。
结果选择。