光看题型分类不够,真正吃透 Optiver OA 要靠完整样题精讲。本文挑了三道有代表性的样题,从题面到代码到变体一气讲完,帮你建立可迁移的解题套路。
Optiver OA 概览
| 维度 | 详情 |
|---|---|
| 平台 | HackerRank / CodeSignal / 自有系统 |
| 时长 | 60–75 分钟 |
| 题量 | 2–4 题 |
| 难度 | LeetCode Medium+,重模拟与数学 |
| 考察重点 | 滑动窗口、贪心、期望值 |
样题一:滑动窗口最大值(价格流)
题面:给定每秒价格数组 prices 和窗口大小 k,输出每个长度为 k 的窗口内的最高价(模拟实时盯盘)。
思路:暴力是 O(nk)。用单调递减双端队列可降到 O(n):队首始终是当前窗口最大值。
from collections import deque
def max_sliding_window(prices, k):
dq = deque() # 存索引,对应价格单调递减
result = []
for i, p in enumerate(prices):
# 移除窗口外的索引
if dq and dq[0] <= i - k:
dq.popleft()
# 移除比当前小的尾部(它们不可能再成为最大)
while dq and prices[dq[-1]] < p:
dq.pop()
dq.append(i)
if i >= k - 1:
result.append(prices[dq[0]])
return result
时间复杂度:O(n) 变体:改成窗口最小价、或同时输出最大最小价差。
样题二:加权中位数(成交量加权价格)
题面:给定若干 (价格, 成交量),求成交量加权中位数——累计成交量首次达到总量一半时的价格。
思路:按价格排序后累加成交量,找到跨过半数的那个价格。
def weighted_median(pairs):
# pairs: [(price, volume), ...]
pairs.sort()
total = sum(v for _, v in pairs)
cum = 0
for price, vol in pairs:
cum += vol
if cum * 2 >= total: # 累计量达到一半
return price
return pairs[-1][0]
时间复杂度:O(n log n) 陷阱:注意「恰好一半」的边界与偶数总量的定义。
样题三:赌局期望(停时问题)
题面:每轮掷一枚均匀硬币,正面 +1 分反面停止。问期望得分。
思路:经典停时期望。设期望为 E,每轮有 1/2 概率继续 +1,1/2 停止:E = 1/2 × (1 + E),解得 E = 1。
def expected_score(p_continue=0.5, reward=1):
# E = p*(reward + E) => E = p*reward / (1 - p)
return p_continue * reward / (1 - p_continue)
关键:识别出「自我引用的期望方程」是这类题的钥匙,绝大多数停时问题都能这样列方程秒解。
常见陷阱清单
❌ 滑动窗口忘记移除过期索引 ❌ 加权中位数把「条数中位」误当「权重中位」 ❌ 期望题强行模拟,超时且不精确 ✅ 看到单调性想双端队列 ✅ 看到「直到…为止」想停时方程
FAQ
Optiver OA 样题和真实考试差多少? 题型高度一致:滑动窗口、贪心、期望值是反复出现的母题,把这几类吃透再做变体就能覆盖大部分真题。
这些题用什么语言写最好? Python 最省时间,deque、heapq、sort 都是内置利器。C++ 在极端数据量下更稳,按个人熟练度选。
期望值题一定要会列方程吗? 强烈建议。停时类、递归期望类题目用方程几秒解决,硬模拟既慢又容易精度出错。
做完样题还要练什么? 练限时和变体。Optiver 最考速度,建议把每道母题的 2–3 个变体都写一遍,形成肌肉记忆。
样题都会了但临场还是慢怎么办? 我们提供 Optiver OA辅助 与 OA代面:用真题难度的样题做限时陪练,帮你把「会做」变成「快速做对」。
正在准备 Optiver 的 OA?
把母题吃透、变体练熟,是 Optiver OA 提速的唯一捷径。我们的导师可提供滑动窗口、加权统计与期望值题的精讲与限时模拟。需要系统规划,欢迎交流,立刻联系微信 Coding0201,获取真题与备考资料。
联系方式
Email: [email protected] Telegram: @OAVOProxy