每年暑期实习季,Goldman Sachs 的 Summer Analyst Program 都是 CS / DS / Quant 同学心里的梦校 offer。不只是大厂光环,更因为项目曝光度高、转正率好、还有跳出常规校招的机会。但想拿到这张门票,第一关 HackerRank OA 就先刷掉一大批人。
这篇文章把 GS OA 的题型结构讲透:90 分钟、2~3 道编程题 + 2 道数学逻辑题,语言不限(Java / Python / C++ / JS 都行)。题型集中在数组字符串处理、图论变形、逻辑推理。下面用三道真实风格的题目逐一拆解。
GS OA 流程 & 题型速查表
| 项目 | 说明 |
|---|---|
| 平台 | HackerRank(带屏幕录制 + 麦克风监控) |
| 总时长 | 90 分钟 |
| 题目数 | 2~3 道编程题 + 2 道数学/逻辑题 |
| 语言 | Java / Python / C++ / JS 等常见语言 |
| 题型分布 | 数组+字符串处理、图论变形、逻辑推理 |
关键点:HackerRank 有屏幕录制 + 麦克风监控,GS 看重「能不能讲清楚思路」,所以哪怕是 OA,也建议适当口述——这一点和后面的 VO 是连贯的。
题目 1:环形发玩具(Find the Damaged Toy)
生日派对上 N 个小朋友(编号 1~N)围成一圈。主持人有 T 个玩具,从编号 D 的小朋友开始一个一个发,发到 N 之后绕回 1。最后一个(坏掉的)玩具会发给谁?
输入:N(小朋友总数)、T(玩具数)、D(起始编号) 输出:拿到最后一个玩具的小朋友编号 示例:N=5, T=2, D=1 → 输出 2(第 1 个给 Kid 1,第 2 个给 Kid 2)
这是一道 Josephus 风格的环形取模题,关键是把「绕圈」转成模运算,不要真的去模拟一圈圈发。
def find_damaged_toy(N, T, D):
# 第 T 个玩具的位置:从 D 开始,再走 T-1 步,环形回绕
# 编号从 1 开始,转成 0-based 做模运算再转回来
start = D - 1
pos = (start + (T - 1)) % N
return pos + 1
复杂度:O(1)。 口述模板:先说「这是环形分配,本质是 (起点 + 步数) 对 N 取模」,再强调 1-based / 0-based 的转换边界——面试官最爱在这里挖坑。
题目 2:编解码消息(Encode / Decode Message)
给一条消息 message(字符串)和一个 key(正整数)。根据操作类型 op:
- op=1(编码):对每个字符,按 key 的数字(循环使用)重复若干次。
- op=2(解码):按 key 的数字(循环使用)把重复字符压缩回去;如果重复次数和 key 不匹配,返回 -1。
示例:op=1, message="Open", key=123 → "Oppeen" 示例:op=2, message="Oppeen", key=123 → "Open"
核心是把 key 拆成数字序列,循环对齐到每个原始字符。
def transform(op, message, key):
digits = [int(c) for c in str(key)]
if op == 1: # 编码
out = []
for i, ch in enumerate(message):
out.append(ch * digits[i % len(digits)])
return "".join(out)
else: # 解码
out = []
i = 0 # message 指针
k = 0 # key 数字指针
while i < len(message):
cnt = digits[k % len(digits)]
# 检查接下来的 cnt 个字符是否全相同
ch = message[i]
if message[i:i + cnt] != ch * cnt:
return -1
out.append(ch)
i += cnt
k += 1
return "".join(out)
复杂度:编码 O(输出长度),解码 O(n)。 坑位:解码时如果剩余字符不足 cnt 个,或重复次数对不上 key,必须返回 -1——这是 hidden case 最常考的边界。
题目 3:迷宫最少步数(Minimum Moves in a Maze)
n × m 迷宫,0 = 空格、1 = 障碍。从 (0,0) 走到 (n-1, m-1),每步可在某一方向上跳 1~k 步,但跳过的格子必须全是 0。求最少步数,到不了返回 -1。
约束:1 ≤ n, m ≤ 100,1 ≤ k ≤ 100。
这是 带跳跃的 BFS 最短路:每个格子向四个方向尝试跳 1~k 步,遇障碍就停止该方向。
from collections import deque
def getMinimumMoves(maze, k):
n, m = len(maze), len(maze[0])
if maze[0][0] == 1 or maze[n-1][m-1] == 1:
return -1
dist = [[-1] * m for _ in range(n)]
dist[0][0] = 0
q = deque([(0, 0)])
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while q:
r, c = q.popleft()
if (r, c) == (n - 1, m - 1):
return dist[r][c]
for dr, dc in dirs:
# 沿该方向跳 1~k 步,遇障碍或越界就停
for step in range(1, k + 1):
nr, nc = r + dr * step, c + dc * step
if not (0 <= nr < n and 0 <= nc < m):
break
if maze[nr][nc] == 1:
break
if dist[nr][nc] == -1:
dist[nr][nc] = dist[r][c] + 1
q.append((nr, nc))
return dist[n-1][m-1]
复杂度:O(n·m·k),在 100×100×100 = 1e6 量级,4 秒时限稳过。
坑位:跳跃方向上一旦遇到障碍要 break(不能 continue),因为跳过的格子必须全空。
备考建议
- 方向明确:GS 偏爱考细节扎实度,重心放在 LeetCode 高频 Medium + 数学/逻辑题。
- 口头表达不能少:HackerRank 有屏幕录制 + 麦克风,建议平时就练「边写边说」。
- 英文读题要练:部分题面表述不够简洁,考前刷几道「语义不清」的英文原题适应一下。
FAQ
Q1:GS OA 是不是必须全 AC 才过? 不是。HackerRank 按通过的 hidden case 数累加分数,但 GS 卡线偏高,建议至少 2 题接近全过。
Q2:数学逻辑题占多大比重? 通常 2 道,权重不低。题型偏概率、排列组合、简单博弈,建议单独留 15 分钟。
Q3:能用 Python 吗?会不会因为慢吃亏? 能用。这三道题数据量都不大,Python 不会 TLE。真正吃亏的是 Quant 岗的数值题,那种建议 C++。
Q4:OA 之后多久出 VO?
一般 12 周。GS 的 VO 是 superday 形式,46 轮连考,建议 OA 一过就开始准备。
正在准备 Goldman Sachs OA?
如果你卡在「读不懂英文题面」「数学题没时间做」或希望面试日有真人 OA代面 / VO辅助 做平台环境检查 + 实时同步陪跑,可以聊聊看完整的 OA辅助 / VO代面 方案:从题型预测、限时 mock 到全程实时辅助 + 复盘,一条龙覆盖 HackerRank / Codility / CodeSignal / Karat 多平台。
联系方式
需要面试真题与定制备战计划?立刻联系微信 Coding0201,获取真题。
Email: [email protected] Telegram: @OAVOProxy