亚马逊专访 |设置 109(校内)
亚马逊几天前访问了我的校园。我没有通过亚马逊的最后一轮,但在被亚马逊拒绝后的第二天我就被选入了 DE Shaw 😀
这是我在亚马逊的面试经历。
在线回合(在 HackerRank 上进行):
20 个 MCQ 问题和 2 个编码问题(没有 C++ 问题、C 输入输出问题(非常难)和能力问题)。
编码问题:
1. 合并重叠区间(众所周知的重复问题)。
2.给定一个单链表,你必须从最后一个节点中减去第一个节点的值,依此类推,直到你到达中间节点。
例如:输入:5 -> 4 -> 3 -> 2 -> 1
输出:4 -> 2 -> 3 -> 2 -> 1
忠告:很多人说打1个码就可以过第一关,其实不然,我两个都打了,很多只打了一个码的朋友都被拒了。制作这两个代码的每个人都被选中。有一些学生通过只编写一个代码完成了这一轮,但我的建议是不要在这里只编写一个代码来试试你的运气。
第 1 轮(提高标准):
完整讨论我的项目。
假设您有一个包含十亿条目的文件,并且您必须根据列对文件的数据进行排序,并且只能将该列放入内存中,然后将其放入内存已满。
例如,您的文件包含
姓名 年龄 地址 密码 性别
………… …………
并且您可能必须根据 Pincode 对文件进行排序,然后您只能将 Pincode 放入内存中。
我首先使用合并排序来处理它,但这需要将整个文件放入内存中。然后,我建议使用 min heap,但他说十亿个数字的 heapify 过程需要很多时间。他说你快接近了,然后我建议我们可以使用平衡二叉搜索树来存储 Pincode 和索引,然后以中序方式遍历 BST,并将文件的第一个 Pincode 的索引与中序的索引交换元素。他听到后很高兴,并要求我编写代码并注意边缘情况。
我做到了。
第 2 轮(CS 基础)
他想检查我对 DBMS、操作系统和计算机网络的了解。询问与这些主题相关的所有内容,包括所有网络层以及从进程线程到死锁到操作系统中的内存管理。要求 SQL 查询从数据库中查找学生的第三高分。我给了他 2 个解决方案🙂。
问我最喜欢的排序算法。我最喜欢的是插入排序,但我告诉他归并排序,因为我对归并排序了解很多,所以我想把面试推向归并排序,正如预期的那样,他问了很多关于归并排序的问题,我给了他所有的答案。
他让我从给定的树的前序和后序遍历构建一棵树,我说不可能只从这两个遍历构建一棵树,你必须给我才能构建一棵独特的树。
第 3 轮(CS 基础知识 + 编码)
关于项目的深入讨论。
要求我选择我最喜欢的主题,而不是任何与编码或算法相关的主题。我说计算机网络。他问为什么是你最喜欢的?为什么不是操作系统或 DBMS?
他问我在浏览器中输入 www.amazon. 时会发生什么。我期待这个问题:P。我知道这一点,把一切都告诉了他。
请参阅以下链接以获取解决方案
导航到 URL 时真正发生的情况
当您在浏览器中浏览网站时究竟会发生什么?
在浏览器中键入 URL 时会发生什么
他让我现在解决一个编码问题。
假设我有一个未知大小的排序数组,那么我将如何有效地搜索这个数组中的元素。
我说我可以将 int i 增加 2 的幂,并检查给定的 arr[i] > 元素是否在找到这样的元素时进行搜索,然后我可以在 i/2 和 i 之间应用二进制搜索。他说这种方法会起作用,但是如果在增加 i 的同时跨越数组长度会发生什么。假设一个数组的大小为 6,那么您的 i 将变为 8,并且 arr[8] 将给出垃圾值,因此您的程序可能会进入无限循环。我说我可以在 try 块中增加 i 并且每当发生这种情况时,我可以在 catch 块中捕获异常,我会将 i 减少 1。
他微笑着让我通过处理边缘情况来编写代码。
第 4 轮(编码)
关于安全项目的深入讨论。面试官让我设计一个类似于 WhatsApp 的聊天应用的数据库。我做到了,说如果有入侵者访问数据库怎么办,然后我说我会对电话号码应用 md5 加密,然后他问我 md5 是如何工作的。为什么只有md5?他问我什么是中间人攻击,并要求我从消息传输中删除中间人攻击。他印象深刻。 🙂
然后他问我什么是缓存,为什么缓存速度快,以及它在架构上与 RAM 和硬盘有何不同。这个是保镖,我讨厌计算机体系结构,承认我是计算机体系结构的初学者。他笑着说,感谢上帝,有一件事你是初学者。我也笑了😀
他进一步转向编码。
1.假设二叉树的结构是
struct node { int val;
struct node *left,*right,*random;
}node;
随机指针指向二叉树的任何随机节点,甚至可以指向 NULL,那么你将如何克隆这棵树。
这是导致我被拒绝的罪魁祸首。
我想了很多,但无法直接解决。我说我们可以使用散列,然后他说如果树中有重复项,那么你的散列将失败,然后我说我们可以将二叉树转换为双链表,然后克隆双链表,他说好的,但是你将如何从双向链接列表中生成原始树,我从未说过它是平衡的。我在这里想了很多,坚果是的,无法解决。
面试后我通过尝试得到了解决方案,您可以通过遍历树轻松克隆左右指针并克隆随机指针,您可以应用:newroot->random=oldroot->random;老根->随机=新根;
然后再遍历新树,放入newroot->random=newroot->random->random。
2. 找出1s个数最多的行
我有效地解决了它。