1. 题目解析与需求拆解
这道编程题的核心要求是:给定一个由英文字母组成的字符串(长度不超过10000),需要将其中的字符按照"GPLT"的顺序重新排列输出,并忽略其他非G/P/L/T的字符。关键在于以下几点:
- 大小写不敏感:即g和G都视为G,p和P都视为P,以此类推
- 循环输出:按照G→P→L→T的顺序循环输出,直到所有有效字符都被输出完毕
- 数量不均处理:当某一类字符先耗尽时,跳过该字符继续按顺序输出剩余的
举个例子,输入"helloworld",其中包含的GPLT字符有:
- h(e)l(l)o(w)o(r)l(d) → 只有l和o(O不算),所以输出应该是L
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法设计
2.1 基础解法分析
最直观的解法可以分为以下几个步骤:
- 字符统计:遍历输入字符串,统计G/g、P/p、L/l、T/t四种字符各自的数量
- 循环输出:按照G→P→L→T的顺序循环输出,每次输出一个字符就将对应计数器减1
- 终止条件:当所有四种字符的计数器都归零时停止
这种解法的时间复杂度是O(n),空间复杂度是O(1),因为只需要常数空间存储四个计数器。
2.2 边界情况考虑
需要特别注意以下几种特殊情况:
- 输入字符串为空
- 输入字符串中不包含任何G/P/L/T字符
- 某类字符数量远多于其他类
- 大小写混合的情况
3. 代码实现与优化
3.1 Python实现示例
python复制def output_gplt(s):
count = {'G':0, 'P':0, 'L':0, 'T':0}
for c in s.upper():
if c in count:
count[c] += 1
result = []
while any(count.values()):
for char in 'GPLT':
if count[char] > 0:
result.append(char)
count[char] -= 1
return ''.join(resul
