L1-023 输出GPLT
分数 20
题目描述:给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....
这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT
的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
思路分析:
使用一个 计数器 + 按顺序输出 的思想。具体来说,程序依赖于 map
数据结构来跟踪输入字符的数量,并利用 while
循环和 for
循环的组合确保按指定的顺序输出字符。逻辑的核心思想是:
- 统计字符出现次数:使用
map
统计输入字符的频次。 - 按顺序输出特定字符:通过顺序遍历
'G'
、'P'
、'L'
、'T'
,确保按要求的顺序输出字符。 - 防止重复输出:通过减少字符计数来防止字符被多次输出。
先给出代码示例
#include <iostream>
#include <map>
using namespace std;
char x,y[]={'G','P','L','T'};
map<char,int>m;
int main()
{
while(cin >> x) m[toupper(x)]++;
while (m['G']+m['P']+m['L']+m['T'])
{
for (int i = 0;i < 4;i++)
if (m[y[i]])
{
cout << y[i];
m[y[i]]--;
}
}
return 0;
}
首先读取一行字符串,可以在输入的同时直接对GPLT进行计数 。为此我们在开头就规定了一个map<char,int>;键为字符,值为整数(出现次数)。
while (cin>>x) m[toupper(x)]++;
只要还有四个字母的任意一个存在就继续打印输出
while (m['G'] || m['P'] || m['L'] || m['T'])//当还有四个字母中任意一个存在时
后续根据先前统计过的计数器m ,按照GPLT进行打印输出
for (int i=0;i<4;i++) {
if(m[y[i]]) {
cout<<y[i];
m[y[i]]--;//通过减少字符计数来防止字符被多次输出。
}
}
成功拿到20分!
总结:
这段代码的核心思想是统计并按顺序输出特定字符。它首先统计字符的出现次数,然后按特定的顺序输出字符,直到所有字符的计数变为 0。它使用 map
来存储字符及其计数,并使用 while
和 for
循环来控制输出顺序和避免重复输出。
标签:输出,顺序,20,字符,map,PTA,while,GPLT From: https://blog.csdn.net/m0_54750154/article/details/143823253