题目背景
这道题是 PAT 乙级的经典模拟题,考察的是对字符频次的统计与循环控制。很多初学者容易把问题想复杂,试图用复杂的列表操作来模拟'消耗',其实只需维护好计数状态即可。
解题思路
核心逻辑很简单:
- 统计输入字符串中 P、A、T、e、s、t 这六个字符各自出现的次数。
- 设定一个循环,每次尝试按顺序输出这六个字符。
- 如果某个字符还有剩余,就打印一个并减一;否则跳过。
- 重复上述过程,直到所有字符都被消耗完。
原代码中直接修改列表 b 的做法在边界条件下容易出错,比如当某字符数量为 0 时,移除操作可能导致后续逻辑混乱。我们改用字典或 Counter 来管理计数,逻辑会更清晰且不易出错。
代码实现
import collections
# 读取输入
s = input().strip()
# 统计目标字符频次
target_chars = ['P', 'A', 'T', 'e', 's', 't']
counts = collections.Counter(s)
result = []
# 只要总次数大于 0,就继续循环
while sum(counts[c] for c in target_chars) > 0:
for char in target_chars:
if counts[char] > 0:
result.append(char)
counts[char] -= 1
print("".join(result))
关键点解析
这里没有使用 remove 方法,而是通过判断 counts[char] > 0 来决定是否输出。这样做的好处是:
- 不需要动态修改列表结构,避免索引错乱。
- 逻辑直观:有货就发,没货就等下一轮。
- 效率上,虽然多了一层循环判断,但对于长度 10000 的数据量完全可接受,且代码可读性大幅提升。
实际运行时,如果遇到测试点报错,多半是输入处理或边界条件(如空字符串,但题目保证非空)的问题。注意 input() 可能会带换行符,建议加上 .strip() 清洗数据。

