← 返回博客列表 Goldman Sachs OA 三大题型实录:环形发玩具 + 编解码消息 + 迷宫最少步数
Goldman Sachs

Goldman Sachs OA 三大题型实录:环形发玩具 + 编解码消息 + 迷宫最少步数

2026-06-03

每年暑期实习季,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),因为跳过的格子必须全空。

备考建议

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