给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
解题思路
- 字符统计 :由于我们只关心'G', 'P', 'L', 'T'这四个字符(不区分大小写),我们需要遍历输入字符串,并计算这四个字符各自出现的次数。这里,我们使用一个长度为4的整数数组count来分别存储'G', 'P', 'L', 'T'的计数。数组的索引0, 1, 2, 3分别对应这四个字符。
- 统一字符大小写:为了使程序能够处理大小写不一的输入,我们首先将整个输入字符串转换为大写(或小写)。这样,无论输入是大写还是小写,都可以统一处理。
- 遍历并计数 :对于字符串中的每一个字符,我们检查它是否是'G', 'P', 'L', 'T'中的一个。如果是,相应的计数器增加。这个过程可以通过switch语句实现。
- 按顺序输出:最后一步是根据GPLT的顺序输出字符。我们在一个循环中做这件事,每次循环都尝试按照GPLT的顺序输出一个字符。如果某个字符的计数器已经为0(意味着该字符已经全部输出),则跳过它。循环继续进行,直到所有字符的计数器都为0。
- 使用StringBuilder :在Java中,字符串是不可变的。因此,频繁的字符串连接操作(如在循环中添加字符)会产生很多临时对象,降低效率。为了提高效率,我们使用StringBuilder 来构建最终的字符串。StringBuilder允许我们在一个可变的字符序列中添加字符,从而减少不必要的对象创建。
解题过程中遇到的问题
- 如何让输出的字符按照GPLT的顺序
- 运行超时的问题
代码
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int[] count = new int[4]; // 用于存储G, P, L, T的数量
char[] chars = str.toUpperCase().toCharArray(); // 转换为大写,便于处理
// 统计G, P, L, T的数量
for (char c : chars) {
switch (c) {
case 'G': count[0]++; break;
case 'P': count[1]++; break;
case 'L': count[2]++; break;
case 'T': count[3]++; break;
}
}
StringBuilder sb = new StringBuilder();
while (count[0] > 0 || count[1] > 0 || count[2] > 0 || count[3] > 0) {
if (count[0]-- > 0) {
sb.append('G');
}
if (count[1]-- > 0) {
sb.append('P');
}
if (count[2]-- > 0) {
sb.append('L');
}
if (count[3]-- > 0) {
sb.append('T');
}
}
System.out.println(sb);
}
}