小凯的排序
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
调皮的小凯喜欢排序,拿到什么东西都要排一下序。现在他觉得单一的递增递减排序已经不能满足他了,所以他要制定一个新的排序规则,规则如下:给定一个长度不超过100的字符串,里面包括大写字母、小写字母、数字与其他英文标点符号(包括空格,但没有回车),如果是大写字母,就按照从Z到A降序来排,如果是小写字母或数字,就按照从a到z或从0到9来排,其他字符则保留排序前与排序后各个位置对应的字符类型不变。如排序前是“M105cpICcaZ”,则排序后是“Z015acMIcpC”。
Input:
输入包括多组数据,每组数据第一行为一个整数n(1<=n<=100),代表字符串的长度,接下来是一行字符串。
Output:
对于每组数据,输出排序后的结果。
Sample Input:
11 M105cpICcaZ 18 #InClude <STDio.H>
Sample Output:
Z015acMIcpC #TdSeiln <IHDou.C>
解题思路:简单字符串处理,将大写字母、小写字母、数字各自排好序再依次填入对应符合类型的位置,最后再输出一整串结果字符串,水过!
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=105; 4 char ir[maxn],iu[maxn],id[maxn],str[maxn],obj[maxn]; 5 int kr,ku,kd,n; 6 int main(){ 7 while(cin>>n){ 8 getchar();gets(str);kr=ku=kd=0;memset(obj,'\0',sizeof(obj)); 9 for(int i=0;str[i]!='\0';++i){ 10 if(islower(str[i]))ir[kr++]=str[i];//ir数组存放小写字母 11 if(isupper(str[i]))iu[ku++]=str[i];//iu数组存放大写字母 12 if(isdigit(str[i]))id[kd++]=str[i];//id数组存放数字 13 } 14 sort(ir,ir+kr);sort(iu,iu+ku);sort(id,id+kd);kr=kd=0; 15 for(int i=0;str[i]!='\0';++i){ 16 if(islower(str[i]))obj[i]=ir[kr++]; 17 else if(isupper(str[i]))obj[i]=iu[--ku]; 18 else if(isdigit(str[i]))obj[i]=id[kd++]; 19 else obj[i]=str[i]; 20 } 21 cout<<obj<<endl; 22 } 23 return 0; 24 }