高盛 Goldman Sachs SDE Engineering 2026 面试全流程攻略:OA → CoderPad → SuperDay

高盛 Goldman Sachs Engineering SDE 2026 面试全流程攻略

高盛(Goldman Sachs)作为全球顶级投行,其技术团队的面试体系在金融科技公司中独树一帜。不同于纯科技公司注重算法深度,高盛 Engineering 面试的核心特点非常明确:算法题偏简单(Easy-Medium),但 Behavioral Question 和 Business Sense 占比极高。多位候选人反馈”聊得好,第三面就基本稳了”。

本文汇总了 2025 年下半年至 2026 年初的多篇高盛 Engineering SDE 面经(含 Summer Analyst / General Hire / Credit Risk 等方向),覆盖 OA → CoderPad 电面 → SuperDay 全流程,适合准备高盛技术岗的 2026 届候选人。

📊 高盛 SDE 面试流程总览

高盛 Engineering SDE 面试流程通常分为以下几个阶段:

Stage 1:OA 在线笔试 — HackerRank 平台,2-3 小时,2 道 Coding + 若干数学题(概率/微积分/线代)

Stage 2:CoderPad 技术电面 — 45-60 分钟,2 道 Coding(偏 Easy)+ 2 道 Behavioral Question

Stage 3:SuperDay(最终轮) — 1-2 小时,2-3 轮 back-to-back,含 Coding + BQ + Business Sense 深挖

难度评估:Coding 难度 ≈ LeetCode Easy-Medium,低于 Google/Meta 等 FAANG,但 BQ 和 Business Knowledge 是真正的分水岭。高盛更看重沟通能力、团队协作和商业敏感度。

📝 Stage 1:OA 在线笔试试题汇总(2025-2026)

高盛 Engineering OA 的形式在不同季度会变化,但高频题型已经非常清晰。以下按题目分类整理:

题型一:Process Starvation Time(进程饥饿时间)

这是 2025 年 OA 出现频率最高的题目之一。题目描述如下:

有 n 个进程需要在 CPU 上执行,数组 priorities 表示每个进程的优先级。CPU 按逆序从索引 n-1 到 0 依次执行。如果某个进程 i 在它的执行之前,有比它优先级更低的进程先被执行,则进程 i 经历”饥饿”。饥饿期从第一个更低优先级进程开始执行算起,到进程 i 自己被执行为止。每个进程执行耗时 1 单位,计算每个进程的饥饿时间。

简化理解:对于每个下标 i,找到最大的 j(j > i 且 priorities[j] < priorities[i]),则饥饿时间为 j – i。若不存在这样的 j,饥饿时间为 0。

def starvation_time(priorities):
    """
    计算每个进程的饥饿时间。
    CPU 从右往左执行,如果某进程右边有更低优先级的进程先执行,
    则产生饥饿时间 = 那个低优先级进程的索引 - 当前进程索引。
    """
    n = len(priorities)
    result = [0] * n
    
    # 从右往左扫描,维护一个单调栈
    # 栈中存储索引,对应优先级递增
    stack = []  # 单调递增栈(按优先级)
    
    for i in range(n - 1, -1, -1):
        # 弹出栈中优先级 >= priorities[i] 的元素
        while stack and priorities[stack[-1]] >= priorities[i]:
            stack.pop()
        
        if stack:
            # 栈顶是右边第一个优先级比 i 小的
            result[i] = stack[-1] - i
        
        stack.append(i)
    
    return result

# 示例
print(starvation_time([4, 2, 3, 1, 5]))
# CPU 执行顺序: 5→1→3→2→4 (从右往左)

面试策略:这道题本质是”找右边第一个更小的元素”,经典单调栈问题。面试官通常会要求你从暴力 O(n²) 解法开始,然后优化到 O(n)。注意 edge case:空数组、单元素、全部递增/递减。

题型二:Transaction Segments(交易递增子段计数)

2025-11 高盛 Engineering OA 新题:

给定长度为 n 的数组 transactionValues,统计严格递增且长度恰好为 k 的连续子段的数量。严格递增定义:每个元素都比前一个大。

def count_increasing_segments(transactionValues, k):
    """
    统计严格递增、长度恰好为 k 的连续子段数量。
    滑动窗口解法:O(n) 时间
    """
    n = len(transactionValues)
    if n < k or k < 1:
        return 0
    
    count = 0
    length = 1  # 当前递增序列的长度
    
    for i in range(1, n):
        if transactionValues[i] > transactionValues[i - 1]:
            length += 1
        else:
            length = 1
        
        if length >= k:
            count += 1
    
    return count

# 示例
# [1, 2, 3, 4, 2, 3, 4], k=3
# 递增段: [1,2,3], [2,3,4], [3,4], [2,3,4], [3,4]
# 长度>=3: 位置2(1,2,3), 位置3(2,3,4), 位置6(2,3,4) → 3个
print(count_increasing_segments([1, 2, 3, 4, 2, 3, 4], 3))

解题思路:滑动窗口,维护当前递增序列长度。当长度达到 k 时,说明从当前位置往前 k 个元素构成一个严格递增子段。这道题考察的是遍历中维护状态的能力,属于高盛 OA 的典型风格——不是超难题,但需要细心处理边界条件。

题型三:Efficient Tasks(三服务器最大最小化难度)

这道题在 2025-09 至 2025-11 的 OA 中反复出现,是高盛的”招牌题”:

给定 n 个软件模块,每个模块有难度值。将所有模块分配给 3 个服务器,每服务器至少一个模块。分配后,从每个服务器各选一个模块,计算 |d1 – d2| + |d2 – d3|。要求:在所有分配方式中,找到“最小值中的最大值”——即无论对方怎么选,你能保证的最大值。

def getMaxDifficulty(difficulty):
    """
    将模块分配到 3 个服务器,使得:
    对于每种分配,对方选三个模块使 |d1-d2|+|d2-d3| 最小化,
    你在所有分配中最大化这个最小值。
    
    核心思路:排序后,最优策略是将最小值和最大值分到不同服务器。
    对方会选最接近的三个值来最小化差异。
    所以答案是排序后相邻元素的差值相关的计算。
    """
    difficulty.sort()
    n = len(difficulty)
    
    if n < 3:
        return 0
    
    # 关键观察:最优分配是将最大/最小值分别放在不同服务器
    # 对方选三个值使 |d1-d2|+|d2-d3| 最小,会选择最接近的三个
    # 你最大化这个最小值,最优答案是 difficulty[n-1] - difficulty[0]
    # 但需要考虑对方可以任意选
    
    # 简化版本:对方选三个值使差异最小
    # 你通过分配让这三个值尽量分散
    # 排序后,最大值 = difficulty[n-1] - difficulty[0]
    # 但对方选最接近的三个,所以实际答案是:
    
    # 贪心思路:将最小值放服务器1,最大值放服务器2
    # 服务器3放中间任意值
    # 对方选 d1(最小), d2(最大), d3(某个中间值)
    # |d1-d2| + |d2-d3| = (max-min) + |max - mid|
    # 要让对方最小化,mid 应该接近 max
    # 所以你希望 max - min 尽可能大,即整个数组的极差
    
    return difficulty[-1] - difficulty[0]

# 测试: difficulty = [5, 1, 2, 5, 3, 5]
# 排序后: [1, 2, 3, 5, 5, 5]
# 答案: 5 - 1 = 4
print(getMaxDifficulty([5, 1, 2, 5, 3, 5]))

深度分析:这道题的 Follow-up 版本(LeetCode 2130 进阶版)在高盛 OA 中出现多次。与 LeetCode 原题"从数组取三个数使 |d1-d2|+|d2-d3| 最大"不同,高盛版本加入了"分配到服务器"的约束,增加了博弈论色彩。核心思路是先排序,然后考虑极差。

题型四:Binary Palindrome(最少操作使二进制串回文)

2025-09 OA 第一题:

def minOperationsForPalindrome(s):
    """
    最少翻转操作使二进制字符串成为回文。
    双指针从两端向中间比较,不匹配就翻转一个。
    """
    s = list(s)
    left, right = 0, len(s) - 1
    ops = 0
    
    while left < right:
        if s[left] != s[right]:
            ops += 1
            # 翻转任意一端即可
            s[left] = s[right]
        left += 1
        right -= 1
    
    return ops

# 示例: "10011" → 需要翻转使回文
# 比较: 1-1(✓), 0-1(✗→flip), 中间0
# 答案: 1
print(minOperationsForPalindrome("10011"))

这道题是 Easy 级别,双指针即可。高盛 OA 通常包含 1-2 道此类基础题来确保基本编码能力。

题型五:Encyclopedia Removal(书架最少取书次数)

2025-09 OA 第二题,难度偏大,多位候选人表示"没什么头绪":

n × m 的书架上放有百科全书,每本书由 k 个作者之一编写(用 1 到 k 的整数表示)。当你选取位置 (i, j) 的书时,同一行和同一列中同一作者的所有书也被移除。求最少选取次数移除所有书。

def minRemovals(shelf):
    """
    最小化选取次数,每次选一本书会移除同行同列同作者的所有书。
    
    关键思路:这本质上是一个图覆盖问题。
    每个 (行, 列, 作者) 的组合构成一个"团",
    选一个位置可以覆盖该位置所在行的所有同作者书
    和所在列的所有同作者书。
    
    简化策略:对于每个作者,找到出现最多的行或列,
    选择该行/列上的任意一本该作者的书。
    """
    if not shelf or not shelf[0]:
        return 0
    
    rows = len(shelf)
    cols = len(shelf[0])
    
    # 统计每个作者在每行/每列的出现次数
    # 然后贪心选择覆盖最多的
    
    # 对于小数据量,可以用暴力 + 剪枝
    # 对于大数据量,需要用图论/匹配方法
    
    # 简化:遍历每本书,贪心移除
    grid = [row[:] for row in shelf]
    count = 0
    
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] != 0:
                author = grid[i][j]
                # 移除第 i 行中所有该作者的书
                for c in range(cols):
                    if grid[i][c] == author:
                        grid[i][c] = 0
                # 移除第 j 列中所有该作者的书
                for r in range(rows):
                    if grid[r][j] == author:
                        grid[r][j] = 0
                count += 1
    
    return count

面试策略:这道题在高盛 OA 中属于"拉分题"。如果你能做出来会很有优势,但做不出来也不用太慌——大多数候选人都表示没思路。关键是展示出你对问题建模的能力(图覆盖/二分图匹配)。

OA 数学题

除了 Coding,OA 中还有若干数学选择题,难度偏小,主要考察本科概率统计和微积分基础:

高频数学题型:

• 概率期望:抛硬币/骰子游戏的期望收益计算

• 条件概率:多面骰子组合的概率分布

• 基础微积分:求导、积分计算

• 线性代数:矩阵运算基础

真题示例:"你和对手各抛 3 枚硬币。如果正面的数量相同,你得到 2^n(n 为正面数)。这个游戏期望值是多少?"

备考建议:数学题通常不难,复习本科概率统计和微积分即可。但如果你是非 CS 背景(如 Math / Physics),这些题目会是加分项。

💻 Stage 2:CoderPad 技术电面

通过 OA 后会收到 CoderPad 电面邀请。格式非常标准化:

时长:45-60 分钟

形式:2 道 Coding + 2 道 BQ

语言:Python / Java / C++ / JavaScript 均可

Coding 高频题

以下是从 2025-2026 年面经中整理的 CoderPad 高频编程题:

题 1:First Non-Repeating Character(LeetCode 387)

找出字符串中第一个不重复的字符。Follow-up:如果加上字符或空格怎么处理?

def firstUniqChar(s):
    """
    LeetCode 387 - 高盛电面高频
    找第一个不重复字符
    """
    from collections import Counter
    
    count = Counter(s)
    for i, c in enumerate(s):
        if count[c] == 1:
            return i
    return -1

# Follow-up: 流式场景(字符逐个到来)
class StreamChar:
    def __init__(self):
        self.chars = []      # 维护顺序
        self.count = Counter()
    
    def add(self, c):
        self.chars.append(c)
        self.count[c] += 1
    
    def first_unique(self):
        for c in self.chars:
            if self.count[c] == 1:
                return c
        return None

题 2:Best Average in Subarray(LC 643 进阶)

找到长度至少为 k 的连续子数组,使其平均值最大。

def findMaxAverage(nums, k):
    """
    高盛 CoderPad 高频题
    找长度至少为k的连续子数组,使平均值最大
    二分答案 + 前缀和: O(n log(max-min))
    """
    # 二分答案法
    left, right = min(nums), max(nums)
    epsilon = 1e-5
    
    while right - left > epsilon:
        mid = (left + right) / 2
        # 检查是否存在长度>=k的子数组,平均值>=mid
        # 等价于: 存在子数组 [i,j] 使得 sum(nums[i..j])/(j-i+1) >= mid
        # 即: sum(nums[i..j] - mid) >= 0
        
        # 构造前缀和
        prefix = [0] * (len(nums) + 1)
        for i in range(len(nums)):
            prefix[i + 1] = prefix[i] + nums[i] - mid
        
        min_prefix = 0  # prefix[0]
        found = False
        for i in range(k, len(prefix)):
            min_prefix = min(min_prefix, prefix[i - k])
            if prefix[i] - min_prefix >= 0:
                found = True
                break
        
        if found:
            left = mid
        else:
            right = mid
    
    return left

# 示例
# nums = [1, 12, -5, -6, 50, 3], k = 4
# 答案: 12.75 (子数组 [12, -5, -6, 50])
print(findMaxAverage([1, 12, -5, -6, 50, 3], 4))

题 3:Chess Bishop(国际象棋主教追击卒)

2025-11 面经中出现的题目:在棋盘上,Bishop 追击任意 Pawn 最少需要几步?

def minBishopMoves(bishop_row, bishop_col, pawn_row, pawn_col):
    """
    Bishop 只能沿对角线移动。
    如果目标在对角线上,1 步可达;
    如果不在同色格上,不可达;
    否则最多 2 步。
    """
    # 检查是否在同一对角线上
    # 主对角线: row - col = constant
    # 副对角线: row + col = constant
    
    if (bishop_row - bishop_col == pawn_row - pawn_col or
        bishop_row + bishop_col == pawn_row + pawn_col):
        return 1
    
    # 检查是否同色(Bishop 不能跨越颜色)
    if (bishop_row + bishop_col) % 2 != (pawn_row + pawn_col) % 2:
        return -1  # 不可达
    
    return 2  # 任意同色格最多 2 步可达

题 4:TransactionAuthorizer(信用卡反欺诈系统)

2026 年最新面经中的系统设计类编码题,三级进阶:

from collections import defaultdict, deque

class TransactionAuthorizer:
    """
    高盛 2026 电面真题 - 信用卡反欺诈系统
    
    Rule 1: 拒绝特定 MCC (Merchant Category Code)
    Rule 2: 全局拒绝 + 用户特定拒绝 MCC
    Rule 3: 速度限制 - 1 小时内累计超过 $5000 拒绝
    """
    
    def __init__(self):
        # Rule 2: 全局拒绝的 MCC
        self.global_rejected_mccs = {9999, 0000}
        
        # Rule 2: 用户特定的 MCC 限制
        self.user_rejected_mccs = {
            "1234": {1111, 2222},
            "5678": {5555, 6666},
        }
        
        # Rule 3: 每个用户的交易记录
        self.user_transactions = defaultdict(deque)
        self.VELIITY_LIMIT = 5000
        self.WINDOW_SECONDS = 3600  # 1 小时
    
    def approve(self, transaction):
        user_id = transaction["user_id"]
        mcc = transaction["mcc"]
        timestamp = transaction["timestamp"]
        amount = transaction["amount"]
        
        # Rule 1 & 2: MCC 检查
        if mcc in self.global_rejected_mccs:
            return False
        
        if user_id in self.user_rejected_mccs:
            if mcc in self.user_rejected_mccs[user_id]:
                return False
        
        # Rule 3: 速度限制 - 滑动窗口
        transactions = self.user_transactions[user_id]
        
        # 清除过期交易
        while transactions and timestamp - transactions[0][0] > self.WINDOW_SECONDS:
            transactions.popleft()
        
        # 计算窗口内总金额
        total = sum(t[1] for t in transactions)
        
        if total + amount > self.VELIITY_LIMIT:
            return False
        
        # 批准交易
        transactions.append((timestamp, amount))
        return True

# 测试 Rule 3
auth = TransactionAuthorizer()
print(auth.approve({"user_id": "1111", "transaction_id": "001", "mcc": "1234", "timestamp": 0, "amount": 500}))
# True - 累计 $500
print(auth.approve({"user_id": "1111", "transaction_id": "002", "mcc": "1234", "timestamp": 60, "amount": 2000}))
# True - 累计 $2500
print(auth.approve({"user_id": "1111", "transaction_id": "003", "mcc": "1234", "timestamp": 3660, "amount": 3000}))
# True - 第一笔已过期,累计 $5000
print(auth.approve({"user_id": "1111", "transaction_id": "004", "mcc": "1234", "timestamp": 7260, "amount": 2001}))
# False - 超过 $5000

这道题的特色:不同于纯算法题,TransactionAuthorizer 考察的是实际工程中规则引擎的设计能力——渐进式增加规则(从单一 MCC 拒绝 → 全局+用户级 → 时间窗口限速),这正是高盛作为金融科技公司的典型面试风格。

Behavioral Question 高频题库

高盛 BQ 的权重远高于一般公司。以下是从面经中整理的高频问题:

团队协作类:

• "你的 manager 让你负责团队 lead,但一个同事不同意,你怎么办?"

• "描述一个你引以为傲的项目"

• "如果学校里有同学窃取你的项目成果,你会怎么做?"

道德/安全类:

• "你是项目的唯一负责人,manager 想要获取你项目中的敏感数据,你怎么回应?"

回答策略:高盛 BQ 的核心考察点是 Leadership、Integrity、Collaboration、Risk Management。建议使用 STAR 框架(Situation → Task → Action → Result)回答,每个回答控制在 2 分钟内。

🏛️ Stage 3:SuperDay 最终轮

SuperDay 是高盛的最后关卡,2026 Summer Analyst SDE 的格式如下:

时长:约 1 小时,2 轮 back-to-back

面试官:VP + AVP / AVP + AVP

第一轮(单人 + 1 道 Coding + BQ):

• 自我介绍

• BQ 问题

• Coding: Longest Substring Without Repeating Characters(最长无重复字符子串)

第二轮(双人 + 2 道 Coding + BQ):

• 自我介绍 + BQ

• Coding 1: Group Anagrams(字母异位词分组),写完会追问时间复杂度计算细节

• Coding 2: 方向控制题(上下左右移动,switch case 实现)

# SuperDay 题1: Group Anagrams
def groupAnagrams(strs):
    """
    高盛 SuperDay 2026 真题
    面试官会追问:时间复杂度计算细节
    """
    from collections import defaultdict
    
    groups = defaultdict(list)
    for s in strs:
        # 排序作为 key: O(k log k),k 为字符串最大长度
        key = tuple(sorted(s))
        groups[key].append(s)
    
    return list(groups.values())

# 时间复杂度: O(n * k * log k),n 为字符串数量
# 空间复杂度: O(n * k)

# SuperDay 题2: 方向控制
def move(x, y, commands):
    """
    高盛 SuperDay 2026 真题
    上下左右移动控制
    """
    directions = {
        "up": (0, 1),
        "down": (0, -1),
        "left": (-1, 0),
        "right": (1, 0),
    }
    
    for cmd in commands:
        dx, dy = directions.get(cmd, (0, 0))
        x += dx
        y += dy
    
    return (x, y)

SuperDay 重要提醒:多位候选人反馈,SuperDay 之后如果没有及时收到回复,发 email 追问也无回音,大概率是默拒。有候选人反馈"难度一般,多做公司题即可"。建议在 SuperDay 后 1-2 周内没有回复就做好备选方案。

📊 高盛 vs 其他投行科技公司面试对比

从高盛、JPMorgan、Citadel 等多家公司面经来看,金融科技公司面试各有特色:

高盛 Goldman Sachs:Coding Easy-Medium + BQ 权重极高 + Business Sense。更像咨询面试,沟通能力和商业敏感度是关键。

摩根大通 JPMorgan:Coding 难度略高于高盛,BQ 同样重要,技术面会涉及更多系统设计。

摩根士丹利 Morgan Stanley:Coding Medium 为主,面试轮次较多,更偏向传统 SDE 面试风格。

Citadel:Coding 难度最高(Medium-Hard),数学/概率题占比大,Quant 方向面试非常硬核。

🎯 高盛 SDE 面试备考策略总结

1. OA 阶段 — 刷题重点:

• 单调栈、滑动窗口、排序 + 贪心 是三大高频算法

• 复习本科概率统计和微积分(数学选择题)

• HackerRank 平台练习,注意 2-3 小时内完成 2 题 + 数学题的时间分配

2. CoderPad 电面 — 刷题重点:

• LeetCode Easy 刷一遍(387, 643, 3, 49 等高频题)

• 准备 5-8 个 STAR 框架的 BQ 故事

• 练习在 CoderPad 上实时编码(不是 LeetCode 的 IDE)

3. SuperDay — 刷题重点:

• 深度准备自我介绍(1-2 分钟版本)

• 了解高盛的业务线和所投岗位的具体工作内容

• 准备金融基础问题(如果是 Credit Risk / Trading 相关岗位)

4. 最关键的一点:高盛面试中,"聊得好"比"写得好"更重要。多位拿到 offer 的候选人提到,到第三面就基本确定了,后面的面试是"走过场"。这意味着你的沟通能力、自我表达能力、对高盛文化的理解,可能比你多刷几道算法题更有决定性。

🚀 需要面试辅导?立即联系我们

✅ 前大厂工程师团队 · 一对一辅导 · 真实案例 · 保密协议

微信: leetcode-king | Telegram: @ayinterview