ACM_小凯的排序(字符串)

小凯的排序

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 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/9226633.html