提到 Susquehanna(SIG)的 OA,大多数人第一反应是 PSA 概率题和 90 秒心算。但如果你投的是 SDE / Software Developer 路径,真正卡人的其实是一套 CodeSignal 编程 OA——平台界面、计分逻辑、题目风格都和 PSA 完全不同。
很多同学拿着「概率题库」准备,结果进考场发现是三道纯算法编程题,时间还卡得死死的。这篇就专门拆 SIG 的 CodeSignal 编程赛道:三道高频题型骨架、完整 Python 解法、70 分钟时间分配,以及最容易丢分的陷阱。
一、SIG CodeSignal 编程 OA 概览
| 维度 | 详情 |
|---|---|
| 平台 | CodeSignal(General Coding Assessment 风格) |
| 题量 | 通常 3-4 题,难度递增 |
| 时长 | 70 分钟左右(部分批次 60-90 分钟) |
| 语言 | Python / C++ / Java 自选,Python 最省时 |
| 计分 | 按通过测试用例比例计分,部分分有效 |
| 考点 | 数组/字符串模拟、贪心区间、图遍历、栈/哈希 |
关键认知:CodeSignal 是按测试用例给部分分的。所以哪怕第三题做不完,把前两题的边界用例全过,比第三题写一半暴力解更划算。先保分,再冲难题。
二、题型一:交易撮合配对(数组 + 哈希)
题目描述
给定一个买单数组 buys 和卖单数组 sells,每个订单是 (price, qty)。当某个买单价格 ≥ 某个卖单价格时可以撮合,成交量取两者剩余量的较小值。要求按「买价从高到低、卖价从低到高」的优先级撮合,返回总成交量。
解题思路
这是典型的「双优先级排序 + 双指针」题。买方出价越高越想成交、卖方要价越低越想成交,所以买单按价格降序、卖单按价格升序,然后双指针推进。
Python 解法
def total_matched_volume(buys, sells):
# 买价从高到低,卖价从低到高
buys = sorted(buys, key=lambda x: -x[0])
sells = sorted(sells, key=lambda x: x[0])
i = j = 0
total = 0
# 当前买/卖单剩余量
buy_left = buys[0][1] if buys else 0
sell_left = sells[0][1] if sells else 0
while i < len(buys) and j < len(sells):
bp, _ = buys[i]
sp, _ = sells[j]
if bp < sp:
# 最高买价都低于最低卖价,无法再撮合
break
deal = min(buy_left, sell_left)
total += deal
buy_left -= deal
sell_left -= deal
if buy_left == 0:
i += 1
buy_left = buys[i][1] if i < len(buys) else 0
if sell_left == 0:
j += 1
sell_left = sells[j][1] if j < len(sells) else 0
return total
时间复杂度:O(n log n + m log m),排序主导 空间复杂度:O(1) 额外空间(不计排序)
高频陷阱
❌ 忘记「价格不匹配就 break」——继续撮合会产生不存在的成交 ✅ 剩余量归零才推进指针,否则会漏掉同价多单
三、题型二:订单簿区间合并(贪心 + 区间)
题目描述
行情系统收到一批挂单价格区间 [lo, hi],表示该订单在这个价位带都可成交。要求合并所有重叠区间后,返回「被至少一个订单覆盖的价格点总长度」。
解题思路
经典区间合并:按左端点排序,线性扫描,维护当前合并段 [cur_lo, cur_hi],重叠则扩展、不重叠则结算并开新段。
Python 解法
def covered_length(intervals):
if not intervals:
return 0
intervals.sort(key=lambda x: x[0])
total = 0
cur_lo, cur_hi = intervals[0]
for lo, hi in intervals[1:]:
if lo <= cur_hi:
# 区间重叠,扩展右端点
cur_hi = max(cur_hi, hi)
else:
# 结算上一段,开新段
total += cur_hi - cur_lo
cur_lo, cur_hi = lo, hi
total += cur_hi - cur_lo
return total
时间复杂度:O(n log n) 空间复杂度:O(1) 额外空间
高频陷阱
❌ lo < cur_hi 写成严格小于——相邻区间 [1,3] [3,5] 会被错误拆开
✅ 循环结束后别忘了结算最后一段 cur_hi - cur_lo
四、题型三:行情路由图遍历(BFS / 最短路)
题目描述
一个行情分发网络由 n 个节点构成,edges[i] = (u, v, latency) 表示双向链路的延迟。从交易所节点 0 出发,求到达所有节点的最小延迟之和;若有节点不可达,返回 -1。
解题思路
带权图单源最短路,用 Dijkstra(堆优化)。最后把所有节点距离求和,遇到不可达直接判 -1。
Python 解法
import heapq
from collections import defaultdict
def total_min_latency(n, edges):
graph = defaultdict(list)
for u, v, w in edges:
graph[u].append((v, w))
graph[v].append((u, w))
dist = [float('inf')] * n
dist[0] = 0
pq = [(0, 0)] # (累计延迟, 节点)
while pq:
d, node = heapq.heappop(pq)
if d > dist[node]:
continue
for nxt, w in graph[node]:
nd = d + w
if nd < dist[nxt]:
dist[nxt] = nd
heapq.heappush(pq, (nd, nxt))
if any(x == float('inf') for x in dist):
return -1
return sum(dist)
时间复杂度:O((V + E) log V) 空间复杂度:O(V + E)
高频陷阱
❌ 用 BFS 当最短路——带权图 BFS 得到的是边数最少,不是延迟最小
✅ if d > dist[node]: continue 这行别省,否则堆里的过期记录会拖慢甚至出错
五、70 分钟时间分配建议
| 阶段 | 时间 | 目标 |
|---|---|---|
| 通读三题 | 0-5 min | 判定难度排序,先易后难 |
| 题一(数组/哈希) | 5-20 min | 全过 + 边界用例 |
| 题二(区间贪心) | 20-40 min | 全过,重点测相邻边界 |
| 题三(图/最短路) | 40-63 min | 先写暴力保部分分,再优化 |
| 复查 | 63-70 min | 跑自定义用例,查空输入/单元素 |
核心心法:CodeSignal 给部分分,所以「三题各拿 80%」远胜「两题满分一题 0 分」。卡住超过 8 分钟立刻切题保分。
FAQ
Q1:SIG 的 CodeSignal OA 和 PSA 概率题是同一场吗? 不是。PSA 是 Problem Solving Assessment(概率/逻辑/心算),CodeSignal 编程 OA 是 SDE 路径专属的纯算法编程测试,两者平台、计分、题型完全独立。投 SDE 通常考后者。
Q2:CodeSignal OA 难度对标 LeetCode 什么水平? 前两题接近 LeetCode Medium,第三题(图/最短路/DP)接近 Medium-Hard。重点不在偏题怪题,而在 70 分钟内把三题都做到高通过率,时间压力是真正的门槛。
Q3:可以用 Python 吗?会不会因为慢被卡 TLE? 可以,且 Python 最省编码时间。SIG 的数据规模通常不会卡 Python,只要算法复杂度对(别在图题用 O(V²))就不会 TLE。
Q4:做不完三题还有机会进面吗? 有。CodeSignal 按测试用例比例给分,前两题全过 + 第三题部分分,分数通常足够进电话面。别为冲第三题满分牺牲前两题的边界用例。
Q5:SIG 编程 OA 之后的流程是什么? 编程 OA → 电话技术面(1-2 轮算法 + 行为)→ Onsite(编程 + 系统/智力题 + 文化匹配)。OA 只是第一道筛子,过了要立刻准备电话面的实时编码。
写在最后
SIG 的 CodeSignal 编程 OA 不靠偏题取胜,靠的是在 70 分钟里把三道中等题稳稳全过。把交易撮合(双指针)、区间合并(贪心)、行情路由(Dijkstra)这三个骨架练到肌肉记忆,再配上「先保分后冲难题」的节奏,通过率会有质的变化。
如果你正在准备 SIG 的 SDE 路径,想要对应批次的 OA 真题还原、限时模考,或需要 OA 辅助 / OA 代面 的节奏对接,可以微信 Coding0201 联系,发岗位 JD 截图,先做赛道判定(SDE 编程 vs Quant 概率),再排练习计划。
需要面试真题? 立刻联系微信 Coding0201,获取真题。
联系方式
- 微信:Coding0201
- Email: [email protected]
- Telegram: @OAVOProxy