1043 输出PATest(20 分)
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400ms
内存限制: 64MB
代码长度限制: 16KB
给定一个长度不超过 104 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest....
这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过 104 的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
redlesPayBestPATTopTeePHPereatitAPPT
输出样例:
PATestPATestPTetPTePePee
题目中没有说是否区分输入字符的大小写,但是根据题意应该是会区分大小写的,如果不放心可以数一下样例中的大小写T输入输出是否相同。
这道题我们同样可以使用一个大小为6的数组分别统计这6个字母的个数,然后循环输出,如果不够就不输出,直到所有的字母剩余个数都为0。
可以使用另一个char型数组来存储6个字母与下标的对应关系,这样寻找根据字母寻找对应下标或者根据下标寻找对应字母都会方便很多。
《算法笔记》中检测所有字母个数都为0的方法是使用一个int型变量保存了字母的总个数,当总个数为0时就停止输出,我的代码中使用了较为笨的方法直接手动对6个字母的个数进行检查。
此题总体来说属于简单题。
AC代码:
#include <cstdio>
#include <ctype.h>
int main() {
int num[6] = {0};
char st[10010];
char m[6] = {'P', 'A', 'T', 'e', 's', 't'};
scanf("%s", st);
for(int i = 0; st[i] != '\0'; ++i) {
switch(st[i]) {
case 'P':
++num[0];
break;
case 'A':
++num[1];
break;
case 'T':
++num[2];
break;
case 'e':
++num[3];
break;
case 's':
++num[4];
break;
case 't':
++num[5];
break;
default:
break;
}
}
while(num[0] != 0 || num[1] != 0 || num[2] != 0
|| num[3] != 0 || num[4] != 0 || num[5] != 0) {
for(int i = 0; i < 6; ++i) {
if(num[i] > 0) {
--num[i];
printf("%c", m[i]);
}
}
}
return 0;
}
如有错误,欢迎指摘。