L1-023 输出GPLT(Java)

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出样例:

GPLTGPLTGLTGLGLL

解题思路

  1. 字符统计 :由于我们只关心'G', 'P', 'L', 'T'这四个字符(不区分大小写),我们需要遍历输入字符串,并计算这四个字符各自出现的次数。这里,我们使用一个长度为4的整数数组count来分别存储'G', 'P', 'L', 'T'的计数。数组的索引0, 1, 2, 3分别对应这四个字符。
  2. 统一字符大小写:为了使程序能够处理大小写不一的输入,我们首先将整个输入字符串转换为大写(或小写)。这样,无论输入是大写还是小写,都可以统一处理。
  3. 遍历并计数 :对于字符串中的每一个字符,我们检查它是否是'G', 'P', 'L', 'T'中的一个。如果是,相应的计数器增加。这个过程可以通过switch语句实现。
  4. 按顺序输出:最后一步是根据GPLT的顺序输出字符。我们在一个循环中做这件事,每次循环都尝试按照GPLT的顺序输出一个字符。如果某个字符的计数器已经为0(意味着该字符已经全部输出),则跳过它。循环继续进行,直到所有字符的计数器都为0。
  5. 使用StringBuilder :在Java中,字符串是不可变的。因此,频繁的字符串连接操作(如在循环中添加字符)会产生很多临时对象,降低效率。为了提高效率,我们使用StringBuilder 来构建最终的字符串。StringBuilder允许我们在一个可变的字符序列中添加字符,从而减少不必要的对象创建。

解题过程中遇到的问题

  1. 如何让输出的字符按照GPLT的顺序
  2. 运行超时的问题

代码

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);

    }


}
相关推荐
手握风云-几秒前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟20 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生26 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
熬夜学编程的小王2 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins2 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶2 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法