近日,GS实习期间来我校招聘2019年“暑期分析师”。
第 1 轮是在 HackerRank 上进行的在线测试。它由3个问题组成——
1. 编码问题(20 分,测试用例的部分标记):基于位操作,我们必须根据给定的规则集为一系列数字创建“超级位串”。我为所有可能的超级位串实现了一个简单的 BFS,并且能够通过所有测试用例。
2. 8 个 CS MCQ(每个 10 分,-2 不正确):问题基于图形、动态规划、复杂性分析、语法分析等。我能够解决其中的大部分问题。
3. 10 个定量 MCQ(每个 10 分,不正确的为 -2):这些基于概率、统计、组合、ML 基础、微分方程等。我在这里不能做很多问题,但大多数情况都是这样人们。
40 名学生入围 F2F 面试,其中不同的候选人面临由多个小组进行的不同轮数的面试。我个人有 6 轮。
第一次面试 –(40 分钟)
1. 通过在 2D 或 3D 中对蛋糕进行“n”次切割而形成的最大和最小区域。他首先让我告诉他我的方法,然后让我通过观察模式或解决我提出的递归来推导出一般情况公式。
2. 给定 n 根绳索,连接 2 根绳索的成本与它们的长度之和成正比。我必须找到产生的最小总成本,以便从它们中创建 1 根绳索。我提出了一种贪婪的方法,其中我使用了最小堆来实现。
3.因为上一个问题我提到了Min-Heap,他问我关于堆上不同操作的时间复杂度。然后他给了我一个未排序的数组,并让我使用堆排序对其进行排序。基本上,他希望我在纸上编写用于从堆中插入、删除和检索的完整代码,我做到了。之后,他让我就地进行堆操作,即使用 O(1) 空间。然后他让我比较 MergeSort、QuickSort 和 HeapSort。他问我为什么堆没有像 BST 那样大量使用,我回答说,与 BST 相比,堆中用于比较两个元素的不变量非常弱(谢谢,麻省理工学院 OCW!)。
第二次面试——(20 分钟)
这一轮更侧重于我的简历和我对计算机科学的兴趣。他问了我 3 个问题,一个基于二分搜索,另一个基于基本的数组操作。第三个是以下问题,必须在对数时间内解决。
https://stackoverflow.com/questions/12238241/find-local-minima-in-an-array
他告诉我一些关于 GS 的工作文化、他在那里的经历以及实习生通常从事的项目。
第三次面试——这是他们中最难的一次,持续了 2 个小时。小组由2个人组成。
(a) 我被问到 4 个问题,他们希望我将我的想法传达给他们,然后将整个事情写在纸上(字面意思是整个事情!)。
1. 货币套利——通过取交换比率的负对数并将它们视为我图中节点(货币)之间边的权重并使用 Bellman-Ford 找到负循环来解决它。
2. 关于遵循一组给定复杂规则的字符串连接问题。我花了很长时间才想出一个朴素的递归解决方案,写下来后,他让我优化。我绘制了递归树并观察了重叠子问题,因此使用制表来提高时间复杂度。他对我的做法很满意。然后我们讨论了一些常见的 DP 问题的方法,例如编辑距离、背包等。
3. 他问我编译器如何确定在 makefile 中执行的编译任务的顺序,我立即回答了拓扑排序。然后他让我把代码写在纸上,并问了一些关于为什么该方法有效及其复杂性的问题。
4. 一个关于二分搜索的简单问题。在最坏的情况下,我必须在 O(lgN) 时间内找到排序数组中某个元素的频率。
(b) 第二位嘉宾看了我的简历,因为我提到了一个正在进行的关于服务器架构和云计算的项目,他让我解释了我将用来模拟网络流量的方法,然后深入研究了从传统架构 -> 虚拟化 -> 容器化 -> 无服务器架构(FaaS)的转变。他想让我比较和对比它们并举例,然后他让我粗略地画出——硬件、主机操作系统、每种技术中的应用程序的分层。
第四次面试——(45 分钟)
面试官是校友,所以我们就我加入的俱乐部/部门和其他课外活动进行了简短的交谈。之后,她问了我几个问题,我都能回答。
1. 基于策略:我们有一叠 n 个硬币和 2 个玩家。在每一回合中,玩家可以从堆叠中取出 1、2 或 3 个硬币。假设两个玩家都以最佳方式玩并且清空筹码的玩家获胜,那么应该对 n 施加什么限制,使得先玩的玩家总是获胜。
2. https://stackoverflow.com/questions/4325200/find-the-majority-element-in-array。
O(n) 时间和 O(1) 空间解决方案预期。
3. https://www.geeksforgeeks.org/closest-palindrome-number-whose-absolute-difference-min/
4. https://www.hackerrank.com/challenges/find-the-running-median/
第 5 次面试 –(40 分钟)
有人问我精通什么语言,我说Java。然后,他问我在Java使用的所有数据结构是什么,我提到了 ArrayLists、Stacks、Priority Queues、HashMaps、TreeMaps、HashSets。
1.给定一个对象列表,其中每个对象可能是也可能不是另一个对象列表,可能是也可能不是另一个对象列表等等,编写代码打印所有非列表对象的内容。
2. 有一个由交易数据(交易ID、值、名称等)组成的动态元组流。在每个元组进来后,我需要根据当前流中存在的值打印“k”最大交易,并且摊销成本应该是 O(1)。我使用了优先队列。在此之后,变化被问到。
(a) 如果 ‘k’ 正在改变怎么办?
每次 k 更改时重新填充优先级队列,并将所有现有元组存储在可以从中引用它们的 HashMap 中。
(b) 如果交易值相同,我们要根据 id 进行比较。你如何实施?
通过使元组( Java的类)实现 Comparable 接口来覆盖默认的 compareTo() 逻辑。
第 6 次面试 –(45 分钟)
在这一轮中没有提出编码问题。我被要求解释我在简历中提到的每一个要点,我们就这些要点中的每一点进行了 10-15 分钟的讨论。对于这些项目,我被要求提供详细的实现和用例。
终于,我被选中参加实习了!