← 返回编程题库
coding-first-duplicate-order-id中等免费版2000ms未尝试

首个被重复使用的订单 ID

First Duplicate Order ID

开始编码

撮合系统的下单网关给每一笔新订单分配一个全局唯一的 order_id。这个唯一性是后续所有撮合、成交回报、风险检查的基本假设——一旦某个 ID 被重复使用,下游就会出现“同一笔订单被撮合两次”、“撤单指令命中错误的活单”这种灰色 bug,而且通常在生产环境里非常难复现。运维和交易系统组的第一道防线,是在每天收盘后的订单流回放里跑一遍唯一性体检:扫一遍当天所有发出去的下单请求,找出最早那个被重复使用的 ID,方便定位是哪一段窗口、哪一个客户端开始出问题。

请实现 solution(orders: list[dict]) -> str | Noneorders 是一段按时间顺序到达的下单记录,每条记录是一个 dict,至少可能包含 order_idsidepriceqty 等字段(也可能有别的字段,忽略即可)。请按时间顺序扫描,**返回第一次触发重复时的那个 order_id**——也就是整段流中第二次出现的那个 ID 的字符串值。规范化规则:取出 order_id 字段后调用 .strip();若该字段缺失、为 None、或剥掉首尾空白后是空字符串,整条记录被丢弃,不参与“见过”集合,也不会触发命中。比较时区分大小写,ABC123abc123 是两个不同的 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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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。