← 返回部落格列表 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