L1-023 输出GPLT(20分)[java][python]

4 阅读2分钟

题目ID:L1-023 分数:20分 语言:Java / Python

题目描述

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

输入格式

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

输出格式

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

样例

输入

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出

GPLTGPLTGLTGLGLL

解题思路

  1. 遍历字符串,统计 G, P, L, T(不区分大小写)四个字符的出现次数
  2. 按顺序 G → P → L → T 循环输出,每输出一个字符对应计数减1
  3. 直到所有计数都归零为止

关键:不区分大小写,所以 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)

总结

本题考察字符串遍历和简单的循环模拟,按固定顺序消耗计数即可。