首个被重复使用的订单 ID
First Duplicate Order ID
开始编码撮合系统的下单网关给每一笔新订单分配一个全局唯一的 order_id。这个唯一性是后续所有撮合、成交回报、风险检查的基本假设——一旦某个 ID 被重复使用,下游就会出现“同一笔订单被撮合两次”、“撤单指令命中错误的活单”这种灰色 bug,而且通常在生产环境里非常难复现。运维和交易系统组的第一道防线,是在每天收盘后的订单流回放里跑一遍唯一性体检:扫一遍当天所有发出去的下单请求,找出最早那个被重复使用的 ID,方便定位是哪一段窗口、哪一个客户端开始出问题。
请实现 solution(orders: list[dict]) -> str | None。orders 是一段按时间顺序到达的下单记录,每条记录是一个 dict,至少可能包含 order_id、side、price、qty 等字段(也可能有别的字段,忽略即可)。请按时间顺序扫描,**返回第一次触发重复时的那个 order_id**——也就是整段流中第二次出现的那个 ID 的字符串值。规范化规则:取出 order_id 字段后调用 .strip();若该字段缺失、为 None、或剥掉首尾空白后是空字符串,整条记录被丢弃,不参与“见过”集合,也不会触发命中。比较时区分大小写,ABC123 与 abc123 是两个不同的 ID。若整段流没有任何 ID 重复,返回 None。
举例:solution([{"order_id": "A1", "side": "buy"}, {"order_id": "B2", "side": "sell"}, {"order_id": " A1 ", "side": "buy"}, {"order_id": "C3", "side": "buy"}, {"order_id": "B2", "side": "sell"}]) 应返回 "A1"。A1 在第 0 条出现一次,第 2 条又出现( A1 剥掉空白等价于 A1),它是第一个被重复用的 ID;虽然 B2 后面也重复了,但触发时间更晚,不是答案。
20 万条记录的体量下,朴素的 if oid in seen_list 会退化到 O(n²)。请用集合做去重判定,整体时间复杂度控制在 O(n) 期望。
约束条件
- 0 ≤ len(orders) ≤ 200000
- 每条记录是形如 `{"order_id": str, "side": str, "price": float, ...}` 的字典,可能还包含其他字段;只需读 `order_id`
- `order_id` 是大小写敏感的字符串;比较前对取出的字段调用 `.strip()`,剥掉首尾空白后再比较和返回
- 若 `order_id` 字段缺失、为 `None`、或剥掉空白后为空字符串,则该条记录被忽略,既不视为见过也不会被报告为重复
- 若整段日志没有任何 ID 出现两次,返回 `None`;若有重复,返回**第一次触发重复时**的那个 ID(即整段流中第二次出现的那个 ID 的字符串值,已剥掉空白)
样例
Case 1 · example from statement (A1 repeats first)
输入: [[{"order_id":"A1","side":"buy"},{"order_id":"B2","side":"sell"},{"order_id":" A1 ","side":"buy"},{"order_id":"C3","side":"buy"},{"order_id":"B2","side":"sell"}]]
期望: "A1"
A1 在第 0 条出现,第 2 条又出现(` A1 ` 剥掉空白等价于 A1),是第一个被重复用的 ID。B2 虽然后面也重复了,但触发时间更晚。
Case 2 · no duplicates in stream returns None
输入: [[{"order_id":"X1","qty":100},{"order_id":"X2","qty":50},{"order_id":"X3","qty":25},{"order_id":"X4","qty":200}]]
期望: null
四条记录的 ID 互不相同,整段流没有重复,按约定返回 None。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · example from statement (A1 repeats first)
输入: [[{"order_id":"A1","side":"buy"},{"order_id":"B2","side":"sell"},{"order_id":" A1 ","side":"buy"},{"order_id":"C3","side":"buy"},{"order_id":"B2","side":"sell"}]]
期望: "A1"
A1 在第 0 条出现,第 2 条又出现(` A1 ` 剥掉空白等价于 A1),是第一个被重复用的 ID。B2 虽然后面也重复了,但触发时间更晚。
Case 2 · no duplicates in stream returns None
输入: [[{"order_id":"X1","qty":100},{"order_id":"X2","qty":50},{"order_id":"X3","qty":25},{"order_id":"X4","qty":200}]]
期望: null
四条记录的 ID 互不相同,整段流没有重复,按约定返回 None。