一.問題描述
給定一個長度不超過10000的、僅由英文字母構成的字元串。請将字元重新調整順序,按GPLTGPLT…這樣的順序輸出,并忽略其它字元。當然,四種字元(不區分大小寫)的個數不一定是一樣多的,若某種字元已經輸出完,則餘下的字元仍按GPLT的順序列印,直到所有字元都被輸出。
輸入格式:
輸入在一行中給出一個長度不超過10000的、僅由英文字母構成的非空字元串。
輸出格式:
在一行中按題目要求輸出排序後的字元串。題目保證輸出非空。
輸入樣例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
輸出樣例:
GPLTGPLTGLTGLGLL
二.問題分析
1)看到這個題先來了解一下題意,題目中給出了一串英文(不區分大小寫)的字元串,然後讓你找到GPLT四個字元按GPLT的順序輸出字元,如果對應字元個數不夠了則直接輸出下一個字元,直到全部輸出為止。
2)首先我們就要計算gplt這四個字元各自的數目,并且存儲起來。這裡我使用了 unordered_map 這一存儲結構進行計數。
3)得到它們各自的個數後按順序輸出即可,見下面代碼。
三.C++代碼
–> 代碼
#include<iostream>
#include<string>
#include<unordered_map>
#include<cstdlib>
using namespace std;
int main()
{
string s;
cin>>s;
unordered_map<char,int>map;
//初始化四個字元
map.emplace('G',0);
map.emplace('P',0);
map.emplace('L',0);
map.emplace('T',0);
//進行計數
for(int i=0;i<s.size();i++)
{
//如果是小寫字母記得減32轉換為大寫字母
if(s[i]=='p' || s[i]=='g' || s[i]=='l' || s[i]=='t')
{
map[s[i]-32]++;
}
if(s[i]=='P' || s[i]=='G' || s[i]=='L' || s[i]=='T')
{
map[s[i]]++;
}
}
//周遊個數,自己進行個數查找判斷正誤
// for(auto iter=map.begin();iter!=map.end();iter++)
// {
// cout<<iter->first<<" "<<iter->second<<endl;
// }
//輸出标準順序
while(map['G']!=0 || map['P']!=0 || map['L']!=0 || map['T']!=0)
{
if(map['G']) {cout<<'G';map['G']--;}
if(map['P']) {cout<<'P';map['P']--;}
if(map['L']) {cout<<'L';map['L']--;}
if(map['T']) {cout<<'T';map['T']--;}
}
cout<<endl;
system("pause");
return 0;
}
–> 結果: