高盛 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 的候选人提到,到第三面就基本确定了,后面的面试是"走过场"。这意味着你的沟通能力、自我表达能力、对高盛文化的理解,可能比你多刷几道算法题更有决定性。