题目ID:L1-023 分数:20分 语言:Java / Python
题目描述
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 GPLTGPLT.... 这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 GPLT 的顺序打印,直到所有字符都被输出。
输入格式
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
样例
输入
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出
GPLTGPLTGLTGLGLL
解题思路
- 遍历字符串,统计 G, P, L, T(不区分大小写)四个字符的出现次数
- 按顺序
G → P → L → T循环输出,每输出一个字符对应计数减1 - 直到所有计数都归零为止
关键:不区分大小写,所以 g/G 都算 G。
代码实现
Java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int[] cnt = new int[4]; // G, P, L, T
for (char c : s.toCharArray()) {
if (c == 'G' || c == 'g') cnt[0]++;
else if (c == 'P' || c == 'p') cnt[1]++;
else if (c == 'L' || c == 'l') cnt[2]++;
else if (c == 'T' || c == 't') cnt[3]++;
}
StringBuilder sb = new StringBuilder();
int[] order = {0, 1, 2, 3};
char[] chars = {'G', 'P', 'L', 'T'};
while (cnt[0] > 0 || cnt[1] > 0 || cnt[2] > 0 || cnt[3] > 0) {
for (int i = 0; i < 4; i++) {
if (cnt[i] > 0) {
sb.append(chars[i]);
cnt[i]--;
}
}
}
System.out.print(sb.toString());
}
}
Python
s = input().strip()
cnt = {'G': 0, 'P': 0, 'L': 0, 'T': 0}
for c in s:
if c in 'Gg':
cnt['G'] += 1
elif c in 'Pp':
cnt['P'] += 1
elif c in 'Ll':
cnt['L'] += 1
elif c in 'Tt':
cnt['T'] += 1
result = []
order = ['G', 'P', 'L', 'T']
while sum(cnt.values()) > 0:
for ch in order:
if cnt[ch] > 0:
result.append(ch)
cnt[ch] -= 1
print(''.join(result))
运行验证
样例验证
输入:pcTclnGloRgLrtLhgljkLhGFauPewSKgt
统计:G=4, P=2, L=6, T=3
按顺序循环输出:G P L T G P L T G L T G L L
输出:GPLTGPLTGLTGLGLL ✓
复杂度分析
- 时间复杂度:O(N + 总输出长度),总输出长度不超过 N
- 空间复杂度:O(1)
总结
本题考察字符串遍历和简单的循环模拟,按固定顺序消耗计数即可。