SWE · CodeSignal OA Levels 1–4

Airbnb Task Management OA:配额、到期、完成与过期历史

四层完整任务管理题从 CRUD/排序延伸到限额指派和过期分析;用不可丢的指派记录统一 active 与 overdue 视图。

题目重点:四层完整任务管理题从 CRUD/排序延伸到限额指派和过期分析;用不可丢的指派记录统一 active 与 overdue 视图。

题意与假设

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

  • 任务只更新不删除,任务创建序号永久不变;用户 ID 唯一,quota 只限制当前未完成且未过期指派数。
  • finish_time 应晚于 assign timestamp;题目只给正整数和时间递增,若 finish≤start 应按真实测试澄清/拒绝。
  • 题目无任务完成后的重新分配禁令,因此同 task 可以继续分配;每次 assignment 都是独立记录。

解题路线

  1. Level 1 保存 taskId→(name,priority,seq),seq 自 1 增长;get_task 用正确 JSON 序列化并强制 name、priority 键顺序,保证空格/引号/反斜杠转义正确。
  2. Level 2 搜索做大小写敏感子串过滤,再按 (-priority,seq) 排序;list_tasks_sorted 对全量任务同序,limit≤0 返回空。
  3. Level 3 用户保存 quota 和 append-only assignments:每条有 taskId、start、finish、completedAt?;assign 时数活跃记录,成功才追加;get_user_tasks 按 (finish,start) 排序,输出任务 ID 可重复。
  4. Level 4 complete 在当前 t 找同 task、同 user 的活跃未完成记录,选最早 start 标记完成;get_overdue 查 finish≤t 且未完成,按 (finish,start) 排序;绝不能把过期指派从历史物理删除。
  5. 测试 t=finish 边界、quota=0、重复 taskId 指派、完成后释放配额、完成最早一条、多个过期同 ID、任务优先级更新后顺序变化。

手动走一遍

训练例:user quota=2,task X 于 t=6 指派至 t=15,再于 t=7 指派至 t=20;t=10 complete(X) 只能完成 t=6 那条,立即释放一个 quota。t=16 时第一条已完成不 overdue,第二条仍 active;t=20 第二条未完成才 overdue。

规模与取舍

任务 CRUD 均摊 O(1);任务搜索/列出基线 O(T+M log M)(M 为匹配数);每用户有 A 条指派时,assign/complete O(A),active/overdue 查询 O(A log A) 基线。保留指派历史占 O(总指派数) 空间;大规模可加 active 堆和历史索引,但不可牺牲审计。

易错点与追问

容易失分的边界

  • 过期后直接删除指派,Level 4 无法统计 overdue。
  • 同任务多次指派用 taskId 作唯一键,覆盖历史。
  • 在 t=finish 仍当 active。
  • 完成任意一条而不是最早 start。
  • 按 task_id 字符串排序导致 task_id_10 排在 task_id_2 前。
  • 手拼 JSON 未转义名字中的引号或反斜杠。

继续深挖

  • 如何把 active/overdue 查询优化到索引级?
  • 用户 quota 调整如何影响现有指派?
  • 如果完成时间恰等于 finish 算成功吗?
  • 能否删除任务但保留历史?
✓已复制微信号!