← 返回部落格列表 Optiver OA 真題整理:SmartDepot 系統模擬 + Zap-N
Optiver

Optiver OA 真題整理:SmartDepot 系統模擬 + Zap-N

2026-08-15

Optiver 的 OA 難度確實不低,之前也輔助過他們家的 VO,整體強度很大。OA 給了 90 分鐘,只需要完成一道題,但不是常規的 LeetCode 演算法題,更偏工程場景和綜合實作,讀題、建模和邊界處理都比較費時間。不過理清要求之後,思路和程式碼整理起來其實很快,最後順利提交。需要 OA輔助 或 OA代面 的同學,也可以照著這份複盤對齊節奏。

OA 概覽

維度 詳情
平台 線上編程 + Zap-N 遊戲環節
時長 90 分鐘(Coding 部分)
題量 1 道 Medium 系統模擬題
類型 工程場景實作,非傳統演算法
考察 建模能力、狀態維護、邊界處理

Coding 是 1 道 Medium 難度的典型系統模擬題,不是傳統演算法題。


Optiver OA 真題:SmartDepot 立體倉庫

題意

要求實作一個 SmartDepot 類別,用來模擬自動化立體倉庫中貨物的存入和取出:

思路

這道題本質上是模擬貨物的存取過程:

整體直接按時間順序暴力模擬即可,重點是處理好每次操作後的狀態更新和邊界條件。由於重量和時間帶小數,可以統一乘以 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(操作數 × 單次代價)。

邊界清單


Zap-N:反應力遊戲環節

除了 Coding,Optiver OA 還有一個 Zap-N 環節,類似於遊戲題,包含 9 個小遊戲(如記數字、圖形匹配切換等),用於測試反應速度、記憶力和任務切換能力

這一環節沒有「刷題」的空間,重在提前熟悉形式、保持專注:


備考策略


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取得一對一客製備考方案

聯絡方式