如果時間有限,與其盲目刷題,不如先搞清楚 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