题目重点:OA 规则数组只含 A/P,每轮按尾部 P 是否达到 replacement rate 决定消除或转化,模拟直到没有动作。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- rate 为正整数,输入仅 A/P;一轮优先执行:若末尾连续 P≥rate,则删最末 rate 个 P;否则若仍有 A,改最后一个 A 为 P;否则停止。
- 停止条件是末尾 P 不足 rate 且无 A,不一定数组为空;如 [P,P]、rate=3 为终态。
- 返回执行动作的轮数,输入可在本地复制;题目没有要求返回每轮数组。
解题路线
- 先用 rate=3、[A,A,P] 的题目描述轨迹确认一轮只执行一个分支,否则会少算轮数。
- 直接模拟可维护可变数组:每轮数末尾 P,若≥rate 就弹 rate 个;否则从右找最后一个 A 并改 P;都做不了时退出。
- 优化观察只有末尾连续 P 与剩余 A 的变化:转换最后一个 A 后,它右侧只能是 P,因此尾部 P 长度+1;可用 A 的位置栈和当前长度,避免每轮从右重复扫描。
- 证明终止:每次转化使 A 数减 1,每次移除使总长度减 rate;最多 n 次转化+n/rate 次移除。
- 测帖中示例、全 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 怎么算?
