PAT 1043. 输出PATest(20)

题目描述:

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“PATestPATest....”这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:
redlesPayBestPATTopTeePHPereatitAPPT
输出样例:
PATestPATestPTetPTePePee

题目分析:

这一道题目难点在于统计这几个字符的个数,并且按照顺序进行全部输出。笔者想到的是设置一个结构体letter(字符的ASCII码值最大为122,使用字母对应的ASCII码值作为数组下标,所以最后设置一个pat[122],每一个数组元素都是letter),成员有 存放字符的a,统计字符的个数num,以及控制字符输出顺序的标签flag其初始值设为6(PATest共有六种字符,将其flag值分别设为0,1,2,3,4,5.最后按照flag使用sort函数进行递增排序即可。)。读入字符串后,遍历,并进行判断是那一个字母。代码如下:

#include
#include
#include
const int maxn=10000;
using namespace std;     
struct letter{
char a;       //存放字符 
int num,flag; //分别对应字符出现次数,控制输出顺序的标签 
letter(){
num=0;flag=6;   //初始化 
}
}pat[122];
bool cmp(letter a,letter b){    //排序函数的比较规则,按照flag值递增排序。 
return a.flag }
int main()
{
char str[maxn];int count=0;      //统计字符串所有的PATest字母出现的次数 
scanf("%s",str);                 //读入字符串 
for(int i=0;i if(str[i]=='P'){             //如果是P ,按照ASCII码值作为数组下标进行存储 
pat['P'].num++;          //P出现的次数加一 
pat['P'].a ='P';          //将字符存入结构体 
pat['P'].flag =0;        //它第一个输出,设为0 
count++;                  //计数器加一 
}
else if(str[i]=='A'){
pat['A'].num++;
pat['A'].a ='A';
pat['A'].flag =1;
count++;
}
else if(str[i]=='T'){
pat['T'].num++;
pat['T'].a ='T';
pat['T'].flag =2;
count++;
}
else if(str[i]=='e'){
pat['e'].num++;
pat['e'].a ='e';
pat['e'].flag =3;
count++;
}
else if(str[i]=='s'){
pat['s'].num++;
pat['s'].a ='s';
pat['s'].flag =4;
count++;
}
else if(str[i]=='t'){
pat['t'].num++;
pat['t'].a ='t';
pat['t'].flag =5;
count++;
}
}
sort(pat,pat+122,cmp);      //进行排序,将PATest这几个字母按照顺序排到数组的最前面 
while(count--){             //只要所有的PATest字母没有输出完,就继续循环 
for(int i=0;i<6;i++){   //6次一循环保证将PATest输出完整 
if(pat[i].num ){       //如果这个字母还没输出完 
printf("%c",pat[i].a );  //输出 
pat[i].num--;       //将该字母剩余输出次数减一 
}  
    }
}



 } 

你可能感兴趣的:(PAT)