SWE · CodeSignal OA Four Levels

Coinbase Task Manager OA:优先级、User Quota、TTL 与最早任务完成

OA 四层从 task CRUD 与 priority 排序扩展到多对多用户分配、TTL、同 task ID 最早 start 完成和过期查询。

题目重点:OA 四层从 task CRUD 与 priority 排序扩展到多对多用户分配、TTL、同 task ID 最早 start 完成和过期查询。

题意与假设

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

  • 训练版 task 是模板,assignment=(assignmentId,userId,taskId,start,expiry,status) 才是会过期/完成的实例;TTL>0,活跃区间 [start,start+TTL)。
  • user quota 限制同一时刻活跃 assignment 数,不限制历史已完成/已过期数;同一 user/task 可重复分配。
  • list priority 训练版降序、同 priority 按 taskId;substring 训练版区分大小写。题目未明确排序方向、并列与大小写细则。

解题路线

  1. L1 维护 taskId→Task;update 保持 ID 不变。L2 过滤 name 包含目标 substring,再按 (-priority,taskId) 排序取前 n;若查询频繁可按 priority 建索引,但更新必须维护索引。
  2. L3 维护 userId→User(quota) 与 userId→assignment IDs、taskId→assignment IDs;assign 前按 query time 结算过期实例,算该用户当前 active 数,再创建独立 assignment。不能只在 task 模板存一个 owner/expiry,因为多对多与重复分配。
  3. L4 complete(user,taskId,now) 在该 user/task 的未完成且 now<expiry 的 assignment 中挑 start 最早者,标 completed;若没有则失败。过期列表从该用户所有 assignment 中取 expiry≤now 且未 completed 的项,按题面输出规则。
  4. 时间操作若非单调,惰性把实例永久改 expired 会妨碍历史查询;训练版假设操作时间单调,否则改事件时间视图。测试 TTL 右端、quota 释放、同 task 多次分配、同 start 并列、先完成后过期。

手动走一遍

训练例 user U quota=2,task T 在 t=1 和 t=2 两次分配、TTL 分别 5 与 2。t=3 complete(U,T) 应选 start=1 的那条;t=4 第二条到期([2,4)),不得再完成。若直接把 T 标 completed,会错误影响另一用户的 T assignment。

规模与取舍

task CRUD 平均 O(1);N task 列表筛选排序 O(N log N);user 有 A 个 assignment 时朴素 assign/complete/expired 查询 O(A),用时间堆和 (user,task) 有序索引可降到 O(log A) 更新与结果数量相关查询,空间 O(N+A)。

易错点与追问

容易失分的边界

  • 把 TTL/完成状态存在 task 模板上,无法表示同一 task 分配多人/多次。
  • quota 算入已完成或过期 assignment。
  • expiry 时刻仍允许完成,违反训练半开区间。
  • 同 task ID 完成任意一条,不遵守最早 start。
  • 没有定义 priority 和 start 并列顺序,输出随哈希遍历变化。

继续深挖

  • 同 start 的两条 assignment 怎样稳定选择?
  • quota 调低且已分配超额时怎么办?
  • 时间戳乱序或历史查询怎样支持?
  • 百万任务按 substring 搜索如何索引?
✓已复制微信号!