小凯的排序
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
调皮的小凯喜欢排序,拿到什么东西都要排一下序。现在他觉得单一的递增递减排序已经不能满足他了,所以他要制定一个新的排序规则,规则如下:给定一个长度不超过100的字符串,里面包括大写字母、小写字母、数字与其他英文标点符号(包括空格,但没有回车),如果是大写字母,就按照从Z到A降序来排,如果是小写字母或数字,就按照从a到z或从0到9来排,其他字符则保留排序前与排序后各个位置对应的字符类型不变。如排序前是“M105cpICcaZ”,则排序后是“Z015acMIcpC”。
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 }