高盛分析师职位面试经验
我一共经历了6轮。总体评估主要集中在数据结构和算法上。我的首选语言是Java 。第一轮是在 Hackerrank 平台上进行的一轮编码。第二轮又是一轮编码,在他们自己的平台编码器上进行,面试官电话在场。在清除编码器轮次后,接下来是四轮面对面的面试。然而,由于大流行,面对面的轮次是通过视频通话进行的。
第一轮(Hackerrank):
有两个问题陈述,我应该解决这两个问题。我的首选语言是Java。
以下是所问问题的链接:
1. https://leetcode.com/discuss/interview-question/625140/goldman-sachs-oa-2020-array-burst-problem-birthday-party(第二题)
2. https://leetcode.com/discuss/interview-question/334671/goldman-sacks-july-2019-hackerrank-2
第 2 轮(键盘):
面试官和我之间共享了一个 coderpad 链接。有两个问题。面试官详细解释了这个问题,然后我开始解决它。完成后,面试官让我编译并运行。所有的测试用例都顺利通过。面试官添加了一些自定义测试用例,再次运行程序进一步检查代码。第二个问题也重复了同样的过程。
以下是我被问到的问题的链接。
1. https://www.geeksforgeeks.org/josephus-problem-set-1-a-on-solution/
2. https://www.geeksforgeeks.org/minimum-length-subarray-sum-greater-given-value/
面谈
所有技术轮次都有两名面试官。所有的面试官都是 7 到 8 岁,主要是在 VP 级别任职。每一轮都以简要介绍开始,然后是关于我的经验、过去和当前项目等的问题。主要是基于数据结构和算法的编码问题。很少有面向语言的问题。
最后一轮是招聘经理。招聘经理简要介绍了他的团队、他们使用的技术、它对组织业务的总体影响等。与其他轮次不同,我没有被要求在这一轮中编写代码。它主要包括深入的讨论和反问。
第一轮(技术轮):
1. 给定数组中整数的连续输入,找出缺失的数字。
测试用例:给我 76 77 79 80 81 作为数组输入,预计返回 78。
预期时间复杂度:O(logn)
在讨论了不同的方法之后,我使用 O(logn) 中的二进制搜索原理解决了这个问题。
这是问题的变体 https://www.geeksforgeeks.org/find-the-only-missing-number-in-a-sorted-array/?ref=rp。整数的差异不必在 1 到 n-1 的范围内。它可以从任何整数开始。
2.糖果粉碎问题:对于一个整数流,所有连续出现超过3次的相同数字都将被抵消。最后返回剩余的整数序列。
有人问我将使用哪种数据结构。预期时间复杂度为 O(n)。
解决方案:我讨论了使用堆栈并跟踪堆栈顶部的方法,我能够在 O(n) 中解决它。
这是问题的链接:https://medium.com/algorithm-and-datastructure/candy-crush-remove-repeating-numbers-1020e3bddfb
3. 给定一个整数数组和一个数 k,找出差值能被 k 整除的所有对。
测试用例:[3,7,11] k=4
答:3
说明:我通过用 k(%k) 的模数替换每个元素来转换数组。然后计算修改后的数组中每个元素的频率。最后添加所有频率C2 将得到答案。
https://www.geeksforgeeks.org/count-pairs-in-an-array-whose-absolute-difference-is-divisible-by-k/
我被问到另一个概率问题。
4. 一个 3X3X3 米的立方体被画在所有的边上。如果立方体被切成1X1X1大小的小立方体,随机选择一个小立方体。选中的小立方体没有任何一面的概率是多少?
解决方案:大立方体中间只有一个大小为 1X1X1 的小立方体,不会被绘制。较小立方体的总数为 27。因此概率 = 1/27。
第 2 轮(技术轮):
这一轮以简要介绍开始,然后讨论我的项目。我被问到与项目相关的问题,例如:授权和身份验证有什么区别?你说的集成测试是什么意思?什么是 REST?
1. 给定两个整数数组,找到两个数组之间的最大路径和,前提是您可以在公共元素处从一个数组跳转到另一个数组。
测试用例:数组 1=> [1 4 5 99 100] 数组 2 => [3 5 8 99 101]
答:218
解:[(1+4) > (3)] + 5 + [(8) > (0)] + 99 + [(101) > (100)] = 5 + 5 + 8 + 99 + 101 = 218
我使用 O(m+n) 中的贪心方法解决了这个问题,其中 m, n 分别是第一个和第二个数组中的元素数。
https://www.geeksforgeeks.org/maximum-sum-path-across-two-arrays/
2. 在二维矩阵中找到从左下角到右下角的所有可能路径,限制条件是您只能向东、东北和东南方向行驶。
解决方案:我使用动态规划方法解决了这个问题,计算 (i,j) 到 (i+1,j+1)、(i-1, j+1) 和 (i, j+1) 的路径成本
dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1] + dp[i][j-1]; where all the cells [i-1][j-1], [i+1][j-1] and [i][j-1] are valid cells ( non negative and not exceeding matrix row-column limit).
基本情况是 dp[row-1][0] = 1;
应该从下到上和从左到右开始对每一列进行计算,从方程可以看出它取决于前一列数据。
我在任何地方都找不到相同问题的任何确切链接。
3. 给定两个整数 n1 和 n2,找出从 n1 形成 n2 所需的最小操作数,仅使用两个操作:乘以 2 和减法 1。
测试用例:n1 = 5,n2 = 7
答:3
解释:
5-1 = 4
4*2 = 8
8-1 = 7
解决方案:我想出了一个解决方案,将 n1 作为根形成二叉树,并通过在父节点上执行操作 * 2 和 -1 来填充级别。然后,找到从 n1 到 n2 的最短路径。思索问题后,我意识到我们甚至不需要构造一棵树,仅仅使用队列基本上 bfs 就可以了。
https://www.geeksforgeeks.org/minimum-number-operation-required-convert-number-xy/
第三轮(技术轮):
1. 给定 n 列火车的到达和出发时间,找出容纳所有火车所需的最少站台数。
时间复杂度:O(nlogn)
https://www.geeksforgeeks.org/minimum-number-platforms-required-railwaybus-station-set-2-map-based-approach/
2.给定一个整数数组,使用数组元素找到最大数(https://www.geeksforgeeks.org/given-an-array-of-numbers-arrange-the-numbers-to-form-the-biggest-数字/ )
测试用例:[7, 4, 90, 3]
答:90743
解决方案:我通过将数组元素假设为 String 并按字典顺序对它们进行排序来解决这个问题。面试官想知道为什么整数排序在这里不起作用?我给了面试官一个反例,并继续使用基于Java中自定义比较器的解决方案。我被问到很多与比较器、匿名类、 Java 8、Lambda 表达式相关的后续问题,因为一件事导致另一件事。
3.设计一个支持前缀搜索的数据结构。例如,当我们在 google.com 中键入任何单词时,我们会根据键入的单词获得建议。
解决方案:我经历了很多讨论,逐步地我能够想出一个可以达到目的的数据结构。在功能上,数据结构就是 Trie 本身,直到那时我才知道。面试官对我到那里都很好,我没有被要求编码,因为我以前不认识 Trie。
(https://www.geeksforgeeks.org/trie-insert-and-search/)
4.最长公共子序列
我被问到这个问题,因为我们还有时间。我们刚刚讨论了这个方法和伪代码。
(https://www.geeksforgeeks.org/longest-common-subsequence-dp-4/)
第 4 轮(招聘经理轮):
这一轮从介绍开始,然后是与我以前的工作相关的问题。为什么我想这么早换?为什么选择高盛?
基于我对金融、股票和交易的兴趣,面试官向我提出了一个与之相关的问题。
1. 为不同的公司设计一个股票买卖交易。 Company Stock buying price Quantity Infi 10 100 TCS 30 50 Infi 20 200 Company Stock selling price Quantity Infi 15 120
我被要求设计一个可以保存交易记录的设计。
对于卖出的 120 只 Infi 股票,数量将分为 100+20(根据第一表所示相同价格买入的股票数量)
因此,购买价格为 100*10 + 20*20。售出 120 只股票后,表格中的记录将被修改,显示所有 100 只股票已售罄。
每当要出售库存时,我们都需要检查分类帐中当前可用的库存数量。对于在不同日期或以不同价格购买的股票,会保存单独的记录。
解决方案:我提出了创建一个地图的想法,该地图以公司名称为键,自定义类的对象为值,其中包含股票价格、数量和交易日期等信息。
2.字符串下一个排列
https://www.geeksforgeeks.org/find-the-next-lexicographically-greater-word-than-a-given-word/
3. 给定一个 0,1,2 的数组对其进行排序。
测试用例:[ 0, 1, 0, 2, 0, 2, 1]
答案: [ 0, 0, 0, 1, 1, 2, 2]
解决方案:我解决了这个问题,保留三个指针并相应地以 O(n) 时间复杂度交换 0,1 和 2。
(https://www.geeksforgeeks.org/sort-an-array-of-0s-1s-and-2s/)
我清除了回合并被选中。