PAT Basic 1108. String复读机
PAT Basic 1108. String复读机
1. 题目描述:
给定一个长度不超过 \(10^4\) 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 StringString....
(注意区分大小写)这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 String
的顺序打印,直到所有字符都被输出。例如 gnirtSSs
要调整成 StringS
输出,其中 s
是多余字符被忽略。
2. 输入格式:
输入在一行中给出一个长度不超过 \(10^4\) 的、仅由英文字母构成的非空字符串。
3. 输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
4. 输入样例:
sTRidlinSayBingStrropriiSHSiRiagIgtSSr
5. 输出样例:
StringStringSrigSriSiSii
6. 性能要求:
Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB
思路:
回血题,先统计出给定字符串中"String"各字符的个数,然后统计出这6个字符的最大个数maxCount
和最小个数minCount
,先输出"String"minCount
遍,然后还需要输出maxCount-minCount
次,每次依次判断6个字符是否还有余量,是则输出相应字符并递减个数。
My Code:
#include <stdio.h>
#define MAX_LEN 10000+1 // MAX_LEN + '\0'
int main(void)
{
char words[MAX_LEN] = "";
int count[6] = {0}; // count of 'S' 't' 'r' 'i' 'n' 'g'
int i=0; // iterator
int minCount=0;
int maxCount=0;
char str[7] = "String";
scanf("%s", words);
for(i=0; words[i]; ++i)
{
switch(words[i]) // count each character
{
case 'S': ++count[0]; break;
case 't': ++count[1]; break;
case 'r': ++count[2]; break;
case 'i': ++count[3]; break;
case 'n': ++count[4]; break;
case 'g': ++count[5]; break;
}
}
minCount = MAX_LEN;
maxCount = -1;
for(i=0; i<6; ++i)
{
if(count[i]<minCount) minCount=count[i];
if(count[i]>maxCount) maxCount=count[i];
}
for(i=0; i<minCount; ++i)
{
printf("String");
}
while(maxCount>minCount)
{
for(i=0; i<6; ++i)
{
if(count[i]>minCount)
{
printf("%c", str[i]);
--count[i];
}
}
--maxCount;
}
printf("\n");
return 0;
}