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