亚马逊面试经历 | Set 204(校内实习)
截止:75%。大约140名学生入围。
第 1 轮(笔试)90 分钟
它包括能力、操作系统、复杂性、散列、图形和复杂性相关问题(20 个问题)。
有两个编码问题
1. 给定一个字符串,找出其中第一个不重复的字符
2. 给定一个整数数组,删除最小数量的元素,使得数组的最小值至少是最大值的两倍。 (需要返回计数)。
第二轮
这一轮以我的简短介绍开始,然后有一个关于数组的问题。
我得到了一个所有元素都大于或等于零的数组
我被要求返回两个数字的最大乘积
这很容易,因为我们可以找到最大值和第二个最大值,他们的产品就是答案,但面试官希望我两个来减少比较的次数。最初我在 O(n) 中进行了 2*n 比较,最后通过成对考虑数字得出了 3n/2 比较的解决方案。面试官对我的解决方案很满意,并要求我为此编写生产级代码。
示例测试用例
5 9 3 7
回答 9*7
现在她又增加了一个约束,我们不允许改变数组的结构,我们需要找到这对,使它们按递增顺序排列
例子
1 9 7 8
回答 7 * 8
最初,我在 O(n2) 中完成,即对于每个元素 i,我找到其右侧的最大值,然后将最大值与第 i 个元素进行比较,那么它可能是可能的对
并且可以为结果做出贡献
我想出了使用段树和稀疏表的(nlogn)解决方案
(范围最大查询)(面试官印象深刻)。
最后,我从右侧创建了一个最大堆栈,并在 O(n) 中使用 O(n) 空间进行了操作,但她仍然希望我将空间减少到 O(1)
已经 1 小时了,她给了我一个提示,从右侧移动
和宾果游戏我能够在短短 5 分钟内回答她。
她对我的解决方案完全满意。
然后就我的项目进行了一次小型讨论。
第二轮
回合再次以我的简短介绍开始,然后他问我最喜欢的主题。
他让我解释任何数据结构。我向他解释了尝试和分割树。我什至告诉他如何使用尝试。我告诉他有关可用的自动完成功能、转发 DNS 和那里的工作(他印象深刻)
现在他从应用的角度提出问题
他问我关于堆和它的用途并评论它
我向他解释了堆优先级队列及其操作的复杂性以及斐波那契堆。
用于合并 k 个排序数组的应用程序。
他让我举例说明循环链表和双链表的一些应用。
我告诉他双链表可以用于 LRU 缓存,使用 hashmap 可以在每个操作的 O(1) 预期复杂度内完成。
我被要求对其进行编码。
对于循环链表,我告诉他它可以有效地实现循环队列,因为我们只需要维护一个指针,即。它的后方。
应用程序 BFS。
然后他让我编写代码并试运行循环缓冲区并对其进行优化并将其与标准循环队列进行比较。
为此,我使用了一个计数器变量来完全使用缓冲区
并告诉他,缺点可能是当多个进程尝试访问这个共享变量时,可能会出现不一致,因此传统的更好。
然后他要求提供临界区、锁、信号量和互斥量。