如果时间有限,与其盲目刷题,不如先搞清楚 Optiver OA 到底最爱考什么。本文按经验估计的出现频率,把 Optiver OA 的高频题型从高到低盘点一遍,让你把复习精力花在性价比最高的地方。
Optiver OA 概览
| 维度 | 详情 |
|---|---|
| 平台 | HackerRank / CodeSignal / 自有系统 |
| 时长 | 60–75 分钟 |
| 题量 | 2–4 题 |
| 难度 | LeetCode Medium+ |
| 考察重点 | 模拟、滑动窗口、期望值 |
频率第一梯队(几乎必考)
订单簿 / 事件模拟(出现率 ~60%)
最具 Optiver 特色,给定订单流模拟撮合或维护盘口状态。识别特征:题面出现 BUY/SELL、bid/ask、撮合、剩余挂单。
import heapq
def best_bid_ask(orders):
buy, sell = [], [] # buy: 最大堆(负价); sell: 最小堆
snapshots = []
for side, price in orders:
if side == 'BUY':
heapq.heappush(buy, -price)
else:
heapq.heappush(sell, price)
best_buy = -buy[0] if buy else None
best_sell = sell[0] if sell else None
snapshots.append((best_buy, best_sell))
return snapshots
时间复杂度:O(n log n)
频率第二梯队(高频)
滑动窗口 / 单调队列(出现率 ~40%)
价格流上的窗口极值、区间统计。识别特征:「连续 k 个」「窗口内最大/最小」。
def max_avg_window(prices, k):
window_sum = sum(prices[:k])
best = window_sum
for i in range(k, len(prices)):
window_sum += prices[i] - prices[i - k]
best = max(best, window_sum)
return best / k
时间复杂度:O(n)
期望值 / 概率(出现率 ~40%)
骰子、硬币、抽样的期望计算。识别特征:「期望」「平均而言」「直到…为止」。优先用期望可加性或停时方程,不要硬模拟。
频率第三梯队(偶尔出现)
背包 / 资源分配变体(出现率 ~20%)
把资金/仓位分配包装成 0-1 背包或完全背包。识别特征:「在预算内最大化收益」。
def knapsack(weights, values, capacity):
dp = [0] * (capacity + 1)
for w, v in zip(weights, values):
for c in range(capacity, w - 1, -1): # 倒序保证每物品只取一次
dp[c] = max(dp[c], dp[c - w] + v)
return dp[capacity]
时间复杂度:O(n × capacity)
按频率分配复习时间
| 优先级 | 题型 | 建议占用复习时间 |
|---|---|---|
| ⭐⭐⭐ | 订单簿模拟 | 35% |
| ⭐⭐⭐ | 滑动窗口 | 25% |
| ⭐⭐⭐ | 期望值 | 25% |
| ⭐⭐ | 背包变体 | 15% |
把前三类吃透,基本能覆盖 Optiver OA 八成以上的题。剩下精力补背包与杂项即可。
FAQ
Optiver OA 最常考什么? 订单簿/事件模拟最高频,其次是滑动窗口和期望值题。这三类几乎是每场 OA 的主菜。
这些频率数据准吗? 是基于历年面经的经验估计,非官方数据,仅供分配复习精力参考,实际题目会有随机性。
只刷高频题够吗? 覆盖八成够拿到不错的分数,但想稳过建议把背包等第三梯队也扫一遍,避免被冷门题打乱节奏。
期望值题为什么这么爱考? 做市本质就是和概率打交道,Optiver 想筛选有概率直觉的人,所以期望题在 OA 和电面都反复出现。
怎么判断一道题属于哪类? 练习时刻意记「识别特征」:看到 bid/ask 想模拟,看到窗口想单调队列,看到「直到」想停时方程,形成条件反射。
正在准备 Optiver 的 OA?
按频率分配精力,是有限时间内提分最快的策略。我们的导师可提供订单簿模拟、滑动窗口与期望值三大高频题的精讲与限时模拟。需要系统规划,欢迎交流,立刻联系微信 Coding0201,获取真题与备考资料。
联系方式
Email: [email protected] Telegram: @OAVOProxy