SWE / SDE 2 · VO Coding / OOD

Uber Parking Lot OOD:车位兼容、入场出场与并发分配

整合 Uber 多篇 VO 停车场 OOD 面经,明确摩托专用/普通车位兼容规则,并设计 park、unpark、checkcar、checkin/checkout 的状态与错误边界。

题目重点:整合 Uber 多篇 VO 停车场 OOD 面经,明确摩托专用/普通车位兼容规则,并设计 park、unpark、checkcar、checkin/checkout 的状态与错误边界。

题意与假设

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

  • 摩托车可停摩托专位或普通位;普通汽车只能停普通位。这一兼容规则来自;车位数量、楼层、收费规则题目未明确,作为可扩展参数。
  • 训练接口 checkin(vehicleId,type) 分配一个可用 spot 并返回 ticketId/spotId,checkout(ticketId) 释放;checkcar(vehicleId) 返回当前停车记录。park/unpark 可视作前两者的简写。
  • 同一车辆同时只能占一个车位;重复 checkin 用幂等键返回现有票或报错,需现场确认。示例选择报错以避免无意识重复占位。

解题路线

  1. 把 Spot 类型与 Vehicle 类型的兼容规则集中在 canPark(vehicleType,spotType),避免散落在 API 分支里。维护空闲摩托位与普通位两个索引。
  2. checkin 先查 vehicleId 是否已在场;摩托车优先用专位以保留普通位给汽车,汽车只试普通位。选定 spot 后在一个临界区/事务中同时写 spot→ticket、vehicle→ticket 和 ticket→记录。
  3. checkout 验证 ticket 仍有效,再原子地删除三个占用索引并归还车位;checkcar 通过 vehicle→ticket O(1) 找到结果。票据状态保存入场/出场时间以便未来收费。

手动走一遍

有摩托位 M1、普通位 R1。摩托 A checkin 分到 M1;汽车 B 分到 R1;另一摩托 C 此时应被拒绝。A checkout 释放 M1 后,C 可入场。若 A 再次 checkout 同一 ticket,不得第二次归还 M1。

规模与取舍

若每类空闲位用最小堆,checkin/checkout 为 O(log S),checkcar 期望 O(1),空间 O(S+V),S 为车位数、V 为在场车辆数。若只需任意可用车位,可用哈希集合实现期望 O(1) 分配。

易错点与追问

容易失分的边界

  • 兼容关系有方向:汽车不能使用摩托专位;摩托先占普通位可能导致后来的汽车被拒,虽仍合法但资源利用较差。
  • 只更新 spot 状态、忘记 vehicle/ticket 索引会导致 checkcar 或 checkout 得到不一致结果。
  • 并发 checkin 若先查空位再各自写入,会把同一车位分给两辆车;要把选择与占用提交放在同一原子边界。

继续深挖

  • 若加入楼层、不同尺寸车位、预约和价格策略,保留 spot 兼容规则接口与分配策略接口,避免用 Vehicle 类继承层次硬编码所有组合。
  • 若跨多个入口部署,把 ticketId/requestId 用作幂等键,持久化唯一约束保护 spot 与 vehicle 的单活占用,出场与支付结算可拆为状态机。
✓已复制微信号!