SWE / SDE 2 · VO Coding / OOD

Uber 会议室预约:在线分配、取消与乱序到达

整合 Uber 多篇会议室面经:从离线 Meeting Rooms II 的最少房间数,延伸到在线返回 room/meeting ID、请求乱序、取消和并发冲突。

题目重点:整合 Uber 多篇会议室面经:从离线 Meeting Rooms II 的最少房间数,延伸到在线返回 room/meeting ID、请求乱序、取消和并发冲突。

题意与假设

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

  • 预约采用半开区间 [start,end),start<end;相接的 [0,10) 与 [10,20) 可以使用同一房间。每次成功预约产生唯一 meetingId,并关联一个固定 roomId。
  • 在线版房间数量 R 预先给定;请求按任意顺序到达,已确认预约不自动换房。若所有房间在该区间冲突则拒绝。
  • 取消通过 meetingId 精确撤销;题目未规定能否重复取消或如何处理未知 ID,训练接口对重复取消返回 false,不影响已有预约。

解题路线

  1. 先分清目标:离线 Meeting Rooms II 可按开始时间排序,最小堆保存当前房间结束时间,O(n log n) 求最少数量;若要离线分配具体 ID,在堆中同时记录房间 ID。
  2. 在线乱序且不可重排已确认预约时,不能只用‘各房间最后结束时间’判断空闲。每个房间按开始时间维护有序预约,插入 [s,e) 时查前驱和后继,两者均不相交才可放入。逐房间尝试,找到首个可用房间后创建 meetingId。
  3. 维护 meetingId→(roomId,start,end) 索引用于取消;取消要同时移除房间有序表记录。并发时对同一房间的冲突检查和插入必须原子化,否则两个线程都可能看见空位并双订。

手动走一遍

两个房间:预约 A=[0,10) 分到房间 0;B=[5,12) 分到房间 1。取消 A 后,乱序到达的 C=[2,6) 可分到房间 0。若只记每间房最后结束时间,无法准确判断 C 与历史预约是否冲突。

规模与取舍

离线数量/分配为 O(n log n) 时间、O(n) 空间。在线朴素逐房间检查在每间有序树/跳表中做前驱/后继,为 O(R log M) 每次预约,M 为单间预约数;取消 O(log M) 加 ID 哈希查找。若只用数组维护排序,插入/删除最坏 O(M)。

易错点与追问

容易失分的边界

  • 最少房间数量不等于可用房间 ID:业务 API 要保留每个 reservation 的稳定标识与具体房间。
  • 请求乱序到达时,按到达顺序进行的不可撤销分配不保证全局使用最少房间;离线贪心最优证明依赖按开始时间排序。
  • ‘允许打断会议/换房间’改变了业务约束,仅对起止时间做 +1/−1 扫描线只能算并发数,不能自动给出合法迁移和冲突处理。

继续深挖

  • 若同一房间高并发,使用房间级事务或排他锁,先读冲突前驱/后继再写预约;需要幂等 requestId 处理重试。
  • 若允许换房或抢占,要明确哪些会议可中断、迁移成本和通知协议;可另建优化模型,而不是在当前固定 roomId 接口上偷偷重排。
✓已复制微信号!