天天看點

L1-023 輸出GPLT (20 分)

一.問題描述

給定一個長度不超過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;
}

           

–> 結果:

L1-023 輸出GPLT (20 分)
L1-023 輸出GPLT (20 分)