题目链接:1043 输出PATest
思路:遍历整个字符串,遇到’P’,‘A’,‘T’,‘e’,‘s’,'t’字符就分别将其存储到一个计数器中(已想到)。
难点在于如何按照PATest的顺序输出。
一开始的想法是遍历字符串,遇到相对应的字符就输出,相应的计数器- -,即:
if (str[i] == 'P') cout << 'P', P--;
else if (str[i] == 'A') cout << 'A', A--;
else if (str[i] == 'T') cout << 'T', T--;
else if (str[i] == 'e') cout << 'e', e--;
else if (str[i] == 's') cout << 's', s--;
else if (str[i] == 't') cout << 't', t--;
但这样仍无法实现按照题干顺序输出,在遍历过程中如果没有暂时遇到P而是遇到s就直接输出了,×。
修改思路:
设计一个循环,只要各个计数器不是全部为0就继续循环,如果某个字符的计数器不为0就输出这个字符并将这个字符的计数器 - -。
#include <bits/stdc++.h>
using namespace std;
int main()
{
char str[10001];
int P = 0, A = 0, T = 0, e = 0, s = 0, t = 0;
fgets(str, sizeof(str), stdin);
for (int j = 0; j < strlen(str); ++j){
switch(str[j]){
case 'P': P++;break;
case 'A': A++;break;
case 'T': T++;break;
case 'e': e++;break;
case 's': s++;break;
case 't': t++;break;
}
}
do{
if(P != 0) putchar('P'), P--;
if(A != 0) putchar('A'), A--;
if(T != 0) putchar('T'), T--;
if(e != 0) putchar('e'), e--;
if(s != 0) putchar('s'), s--;
if(t != 0) putchar('t'), t--;
}while(P != 0 || A != 0 || T != 0 || e != 0 || s != 0 || t != 0);
return 0;
}
值得一提的是,也可以采用while循环来做。
while(1) { if (P == 0 && A == 0 && T == 0 && e == 0 && s == 0 && t == 0) break;
在while (1)中添加一个break出口即可退出循环。