SWE · Onsite Coding

Coinbase 线程日志解析:按 Thread ID 分组并按时间排序

Onsite 给多条 string log,要求能按 thread ID 找该线程所有日志并按时间顺序输出;处理解析错误与同时间戳稳定性。

题目重点:Onsite 给多条 string log,要求能按 thread ID 找该线程所有日志并按时间顺序输出;处理解析错误与同时间戳稳定性。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版每行格式为 `timestamp|threadId|message`,前两个字段必填,message 可含 `|`,所以只 split 前两处;真实题面格式须重写 parser。
  • timestamp 训练版为整数毫秒,threadId 字符串;同 timestamp 按原输入序号稳定输出。坏行收集错误而不进入结果,真实测试契约可选择拒绝整批。
  • 输出为 threadId→按 (timestamp,sequence) 排序的日志列表,查询一个 thread 的内容;不在原题未给时擅推 streaming API。

解题路线

  1. 逐行用固定格式 parser 提取 timestamp/threadId/message,保留原始行与输入 sequence;不要用无界 split 把 message 中的分隔符切碎。
  2. 按 threadId 哈希分组,每组按 (timestamp,sequence) 排序;若全局先排序再分组也能工作,但会多比较不同线程且需稳定键。
  3. 按 thread ID 查询平均 O(1) 找组,返回该组有序列表;若动态插入实时查询,用每线程有序结构或延迟排序,并明确追加时间是否单调。
  4. 时间戳若是 ISO 字符串,先严格解析时区并统一 UTC/epoch;直接按未规范化的本地时间字符串排序可能错。
  5. 测试空输入、只有一线程、多线程交错、同 timestamp、负/大时间戳、message 含分隔符、坏行及线程 ID 类似 `1`/`10`。

手动走一遍

训练行 `12|T1|end`、`10|T2|work`、`10|T1|start|retry`、`10|T1|start`:T1 按时间输出两个 t=10(保持输入中 `start|retry` 在前)再 t=12;T2 单独为 t=10。实际题目没有这些输入字符串。

规模与取舍

N 行解析 O(总字符数),分组排序总 O(Σn_i log n_i)≤O(N log N),存储 O(N);已排序组查询 O(该组长度) 输出成本。

易错点与追问

容易失分的边界

  • 按原 string 字典序排未统一格式的时间。
  • 无界 split 使 message 中的分隔符丢失。
  • 同 timestamp 未定 tie-break,结果每次不同。
  • 把不同 thread ID 的日志混成一条全局列表。
  • 假设题目已给日志格式。

继续深挖

  • 流式新日志不断到来时如何维护排序?
  • 日志量超过内存时怎样按 thread 外排?
  • 时间戳带时区或乱序时如何处理?
  • 坏行是否保留原文用于排错?
✓已复制微信号!