Optiver 的 OA 難度確實不低,之前也輔助過他們家的 VO,整體強度很大。OA 給了 90 分鐘,只需要完成一道題,但不是常規的 LeetCode 演算法題,更偏工程場景和綜合實作,讀題、建模和邊界處理都比較費時間。不過理清要求之後,思路和程式碼整理起來其實很快,最後順利提交。需要 OA輔助 或 OA代面 的同學,也可以照著這份複盤對齊節奏。
OA 概覽
| 維度 | 詳情 |
|---|---|
| 平台 | 線上編程 + Zap-N 遊戲環節 |
| 時長 | 90 分鐘(Coding 部分) |
| 題量 | 1 道 Medium 系統模擬題 |
| 類型 | 工程場景實作,非傳統演算法 |
| 考察 | 建模能力、狀態維護、邊界處理 |
Coding 是 1 道 Medium 難度的典型系統模擬題,不是傳統演算法題。
Optiver OA 真題:SmartDepot 立體倉庫
題意
要求實作一個 SmartDepot 類別,用來模擬自動化立體倉庫中貨物的存入和取出:
- 每個倉庫由若干層貨架組成,容量從底層到頂層按等比數列遞增(1、2、4、8……)。
- 程式需要根據時間戳記錄貨物的存入和取出,並處理貨物重量、保存期限、貨架容量以及操作時間先後等約束。
- 如果操作違反任意約束,就返回失敗;否則更新對應倉庫的狀態並返回成功。
思路
這道題本質上是模擬貨物的存取過程:
- 可以用 Map 按倉庫和層級維護每層的貨物,用 Set 記錄當前已存在的貨物 ID。
- 存貨時按題目規定從底層開始放置。
- 取貨時每次在當前層選擇重量最輕、重量相同時 ID 最大的貨物,取出後再讓下層符合條件的最重貨物上移補位。
整體直接按時間順序暴力模擬即可,重點是處理好每次操作後的狀態更新和邊界條件。由於重量和時間帶小數,可以統一乘以 1000 轉成整數再比較,避免浮點精度誤差,同時在操作前檢查倉庫、貨物 ID、容量、保存期限等輸入是否合法。
Python 實作
class SmartDepot:
"""自動化立體倉庫模擬:貨架容量按 1,2,4,8... 等比遞增。
重量與時間統一乘 1000 轉整數比較,規避浮點誤差。"""
SCALE = 1000
def __init__(self, num_shelves):
# 每層容量:1, 2, 4, 8 ...
self.capacity = [1 << i for i in range(num_shelves)]
# shelf[i] = list of (weight_int, id, expire_int)
self.shelf = [[] for _ in range(num_shelves)]
self.ids = set() # 當前在庫的貨物 ID
def _to_int(self, x):
return round(x * self.SCALE)
def store(self, item_id, weight, expire, ts):
"""存入貨物;違反約束返回 False。ts 為操作時間戳。"""
if item_id in self.ids:
return False # ID 重複
if weight <= 0 or expire < ts:
return False # 非法重量 / 已過期
w, e = self._to_int(weight), self._to_int(expire)
for i in range(len(self.shelf)): # 從底層開始找有空位的貨架
if len(self.shelf[i]) < self.capacity[i]:
self.shelf[i].append((w, item_id, e))
self.ids.add(item_id)
return True
return False # 所有貨架已滿
def retrieve(self, shelf_idx, ts):
"""從指定層取貨:選最輕、重量相同取 ID 最大者;下層最重貨上移補位。"""
if shelf_idx < 0 or shelf_idx >= len(self.shelf):
return None
# 剔除已過期貨物(保存期限先於當前時間戳)
t = self._to_int(ts)
level = [it for it in self.shelf[shelf_idx] if it[2] >= t]
if not level:
self.shelf[shelf_idx] = []
return None
# 最輕優先;重量相同時 ID 最大優先
chosen = min(level, key=lambda it: (it[0], -it[1]))
level.remove(chosen)
self.shelf[shelf_idx] = level
self.ids.discard(chosen[1])
# 下層符合條件的最重貨物上移補位
if shelf_idx + 1 < len(self.shelf) and self.shelf[shelf_idx + 1]:
lower = self.shelf[shelf_idx + 1]
heaviest = max(lower, key=lambda it: (it[0], it[1]))
lower.remove(heaviest)
self.shelf[shelf_idx].append(heaviest)
return chosen[1] # 返回取出的貨物 ID
複雜度:單次 store 為 O(S)(S 為貨架層數);單次 retrieve 為 O(L)(L 為當層貨物數,用於選最輕 / 下層選最重)。按時間順序模擬共 O(操作數 × 單次代價)。
邊界清單
- 貨物 ID 重複存入 → 失敗。
- 重量非正、保存期限早於當前時間戳 → 失敗。
- 目標貨架已滿、所有貨架已滿 → 失敗。
- 取貨層為空或全部過期 → 返回空。
- 浮點重量 / 時間統一乘
SCALE轉整數再比較,杜絕精度誤差。
Zap-N:反應力遊戲環節
除了 Coding,Optiver OA 還有一個 Zap-N 環節,類似於遊戲題,包含 9 個小遊戲(如記數字、圖形匹配切換等),用於測試反應速度、記憶力和任務切換能力。
這一環節沒有「刷題」的空間,重在提前熟悉形式、保持專注:
- 提前了解題型,減少現場適應成本。
- 保持穩定手速和節奏,別因某一關卡失誤影響整體狀態。
- 任務切換類小遊戲考的是抗干擾能力,練習時可用類似的反應力小遊戲熱身。
備考策略
- 系統模擬先建模再寫碼:先把「倉庫—貨架—貨物」的資料結構畫清楚,明確存 / 取的規則和補位邏輯,再動手寫,避免邊寫邊改。
- 浮點一律轉整數:凡涉及小數比較(重量、時間、保存期限),統一乘固定倍數轉整數,是這類工程題的通用防坑技巧。
- 邊界優先於最佳化:Medium 系統題的分數大頭在正確性和邊界,先把所有約束覆蓋全,再談效能。
- Zap-N 提前熱身:反應力環節靠臨場狀態,考前用類似小遊戲找手感即可。
FAQ
Q1:Optiver 的 SWE OA 難度如何?
90 分鐘只有一道題,但不是常規演算法題,而是 Medium 難度的系統模擬題。難點不在演算法技巧,而在讀題、建模和把一堆約束(重量、保存期限、容量、時間先後)都處理乾淨,細緻程度要求高。
Q2:Optiver OA 用什麼形式,有幾個環節?
主要是 Coding(一道系統模擬題,90 分鐘)加上 Zap-N 遊戲環節。Zap-N 含 9 個反應 / 記憶 / 任務切換類小遊戲,考察綜合認知能力,不是編程。
Q3:SmartDepot 這道題最容易踩的坑是什麼?
兩個:一是浮點精度,重量和時間帶小數,直接比較容易出錯,應統一乘倍數轉整數;二是取貨後的「下層最重貨物上移補位」邏輯,容易漏掉或寫反,配合「最輕優先、同重量 ID 最大優先」的選擇規則一起理清。
Q4:Zap-N 環節能準備嗎?
沒法刷題,但能提前熟悉形式、調整狀態。了解 9 個小遊戲大致考什麼(記數字、圖形匹配、任務切換),考前用類似反應力小遊戲熱身,保持專注和穩定手速即可。
Q5:如何準備 Optiver 這類偏工程實作的 OA?
多練系統模擬題:把實體關係、操作規則和約束條件先建模清楚再寫碼,養成「浮點轉整數」「先覆蓋邊界再最佳化」的習慣。Optiver 更看重工程思維和實作的嚴謹度,而非炫技的演算法。
正在準備 Optiver 或其他量化 / 交易類公司的 SWE OA? 我們熟悉 Optiver 這類 90 分鐘一道系統模擬題 + Zap-N 的考法,能陪你把實體建模、約束覆蓋和浮點精度處理一次打磨到位,提供全程 OA輔助 與 OA代面 支援。
立即加入微信 Coding0201,取得一對一客製備考方案。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy