题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
字符串排序:C语言解法
- *首先我们先要获得只有字母的排序列表(不能破坏相同字母本身的顺序),其中的技巧就是循环字符串遇到子母后,添加一个元素(letter - 'a')len + i,然后对整个列表排序,这样我们既能知道字母的顺序,有可以知道他原来在什么位置,是什么字母
- 然后我们就可以判断原字符串每个位置是否是字母,如果不是,就把原字符串该位置的字符赋给结果对应的位置,如果是,就弹出列表的值(取余获得原来位置,取出字母)赋给结果的这个位置,以此循环
#include<stdio.h>
int cmp(int *a, int *b){
return *a-*b;
}
int main(){
char *str = (char*)malloc(sizeof(char)*1000);
while(gets(str)){
int len = strlen(str),temp = 0;
int *order = (int*)malloc(sizeof(int)*len);
char *result = (char*)malloc(sizeof(char)*len+1);
memset(order, 0, sizeof(int)*len);
memset(result, 0, sizeof(char)*len+1);
for(int i=0; i<len; i++){
char let1 = str[i];
if(let1>='a' && let1<='z'){
order[temp++] = (let1 - 'a')*len + i;
}else if(let1>='A' && let1<='Z'){
order[temp++] = (let1 - 'A')*len + i;
}
}
qsort(order, temp, sizeof(int), cmp);
temp = 0;
for(int j=0; j<len; j++){
char let2 = str[j];
if((let2>='a' && let2<='z')||(let2>='A' && let2<='Z')){
int n = order[temp++]%len;
result[j] = str[n];
}else{
result[j] = let2;
}
}
printf("%s\n",result);
}
}