SWE · CodeSignal OA

Capital One A/P 替换轮数:尾部消除与最后一个 A 转 P

OA 规则数组只含 A/P,每轮按尾部 P 是否达到 replacement rate 决定消除或转化,模拟直到没有动作。

题目重点:OA 规则数组只含 A/P,每轮按尾部 P 是否达到 replacement rate 决定消除或转化,模拟直到没有动作。

题意与假设

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

  • rate 为正整数,输入仅 A/P;一轮优先执行:若末尾连续 P≥rate,则删最末 rate 个 P;否则若仍有 A,改最后一个 A 为 P;否则停止。
  • 停止条件是末尾 P 不足 rate 且无 A,不一定数组为空;如 [P,P]、rate=3 为终态。
  • 返回执行动作的轮数,输入可在本地复制;题目没有要求返回每轮数组。

解题路线

  1. 先用 rate=3、[A,A,P] 的题目描述轨迹确认一轮只执行一个分支,否则会少算轮数。
  2. 直接模拟可维护可变数组:每轮数末尾 P,若≥rate 就弹 rate 个;否则从右找最后一个 A 并改 P;都做不了时退出。
  3. 优化观察只有末尾连续 P 与剩余 A 的变化:转换最后一个 A 后,它右侧只能是 P,因此尾部 P 长度+1;可用 A 的位置栈和当前长度,避免每轮从右重复扫描。
  4. 证明终止:每次转化使 A 数减 1,每次移除使总长度减 rate;最多 n 次转化+n/rate 次移除。
  5. 测帖中示例、全 P 不足/达到 rate、全 A、rate=1、空数组和 A/P 交错。

手动走一遍

rate=3、[A,A,P]:尾部 P=1,不够,最后一个 A→P,得 [A,P,P](1);尾部 P=2,最后 A→P,得 [P,P,P](2);尾部 P=3,删 3 个,得 [](3)。

规模与取舍

朴素从右重复扫描最坏 O(n²) 时间,O(n) 复制空间;用 A 位置栈并维护尾部长度可 O(n) 总时间、O(n) 空间。若允许原地修改,额外空间可随实现减少。

易错点与追问

容易失分的边界

  • 一轮同时删 P 和改 A,示例被算成更少轮。
  • 只在数组为空时停止,使全 P 且不足 rate 的终态死循环。
  • rate=0 没有进展;应明确拒绝或另定义。
  • 删掉非末尾 P,改变后续状态。

继续深挖

  • 只求轮数能否不物化每轮数组?
  • rate 很大/数组很长时怎样压缩状态?
  • 若规则改成一次移除所有尾部 P 怎么算?
✓已复制微信号!