← 返回博客列表 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获取一对一定制备考方案

联系方式