给定一个长度不超过 104 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest....
这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过 104 的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
redlesPayBestPATTopTeePHPereatitAPPT
输出样例:
PATestPATestPTetPTePePee
解题思路:
分别定义两个数组,用于存放每个字符需要输出的数量和需要输出的字符;遍历字符串统计每个字符需要输出的数量和总共需要输出的数量,利用while循环判断是否输出完成,嵌套for循环按照"PATest"的顺序进行输出。
本人刚开始时想利用一个变量flag判断已输出完毕的字符串数量,将该变量放在for循环里面自加,但这种方法并不可取,因为每进入一个while循环,就要重新遍历num数组,会导致flag重复加,使得结果错误。
代码:
#include <iostream>
using namespace std;
int main()
{
string s;
int num[6]={0, 0, 0, 0, 0, 0}, i, j, sum=0; // num数组用于记录每个字母出现了几次,初始化为0;sum用于统计六个字母一共出现了几次
char a[6]={'P', 'A', 'T', 'e', 's', 't'}; // 数组a存放要输出的六个字母
cin >> s;
for(i=0; i<s.size(); i++){ // 遍历输入串s,统计所需数据
for(j=0; j<6; j++){
if(s[i]==a[j]){
num[j]++;
sum++;
break;
}
}
}
while(sum){ // 当sum不为0,说明还有数据未输出
for(i=0; i<6; i++){
if(num[i]!=0){ // num数组内的数据不为0说明需要输出
cout << a[i];
num[i]--; // 每输出一次,输出的字符数和总共需要输出的字符数数量均需减一
sum--;
}
}
}
return 0;
}