SWE · 90-minute OA Levels 1–4

Airbnb Working Hours Register OA:晋升生效、历史薪酬与奖励期

四层 OA 题目涵盖进出打卡、Top N、下次进门晋升、历史班次工资和完整落入奖励期的双倍薪酬。

题目重点:四层 OA 题目涵盖进出打卡、Top N、下次进门晋升、历史班次工资和完整落入奖励期的双倍薪酬。

题意与假设

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

  • 打卡时间为单调递增整数,in/out 必须交替;开放中的班次在查询总工时/工资时是否计入题目未说明,训练版仅计已结束班次。
  • 晋升请求对当前班次不生效,只在下一次 in 前应用 pendingPosition/pendingCompensation;同一人多次待晋升以最后一次为准,这是训练假设。
  • 每个已结束班次锁定入门时薪酬;金额按整数最小单位/每秒费率计算;grant period 用半开 [start,end),班次也用半开 [in,out),整班被包含才乘 2。
  • 重叠奖励期只乘一次、不叠加,题目未给多奖励期口径;Top N 同分训练版按员工 ID 升序。

解题路线

  1. 员工状态分 currentPosition/currentCompensation、pendingPromotion、activeInTime 和 completedSessions;打卡入门时先应用 pending,再开始新 session,出门时写 (start,end,compensation,position)。
  2. 总工时从已完成 session 的 end−start 累加并缓存;Top N 按 position 过滤后的总工时降序、ID 升序排序,避免晋升后把旧职位时段误归新职位。
  3. 工资查询遍历与指定时间窗交叉的 session,按交集长度×该 session 锁定的薪酬计算;若 grant 规则要求完整班次,只有整个 session 被奖励期包含时才倍增,不应按重叠分钟局部翻倍。
  4. 奖励期可能后加,避免把 double 金额直接写死在原 session;查询时根据时间窗/奖励期判断,或维护可重算的物化汇总。
  5. 用状态机测试重复 in/out、开放班次、晋升处于班次中、晋升后下一次 in、薪酬历史、班次与奖励期恰好触边。

手动走一遍

训练例:员工以 10 单位/秒在 [0,10) 工作,期间设下一档 20;第二次 [20,25) 入门时才应用新薪酬。原工资 10×10+20×5=200。若奖励期 [20,25) 恰好覆盖第二班次,则该班次变 200,总工资 300,额外双倍部分为 100;数字与单位只是训练示意。

规模与取舍

登记/打卡若按员工索引为 O(1) 均摊,Top N 从 E 名员工排序 O(E log E);工资按该员工 S 个班次扫描 O(S),可按时间索引/预聚合优化但奖励期插入会带来回填成本。存储 O(E+总班次数+奖励期数)。

易错点与追问

容易失分的边界

  • 晋升请求立刻改当前班次薪酬。
  • 只存当前 salary,历史班次被追溯改价。
  • 班次只部分落入 grant period 就整体双倍。
  • 将多次奖励期无说明地叠乘。
  • 开放班次在总工时查询的口径不明确却写死。

继续深挖

  • 奖励期在历史工资发放后才新增怎么办?
  • 跨多个奖励期的班次如何定义?
  • 百万员工 Top N 查询频繁时怎样维护索引?
  • 打卡时间乱序或补录如何处理?
✓已复制微信号!