光看題型分類不夠,真正吃透 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