设置number数组,0-25代表a-z,26-52代表A-Z遍历数据,有字母,相应位置加一
设置sort数组,0-25代表a-z(不分大小写),当number进入小写字母时候,sort相应位置乘以10并且加1,当进入大写字母时,sort相应位置乘以10并加2(例如sort[0]=1211)那就说明a的顺序应该是aAaa(其中下标0代表是字母a,1211分别代表大小写)
#include<stdio.h>
int main(){
char data[1000]={0};
scanf("%[^\n]", data);
int numbers[52]={0};
long long sort[26]={0};
for(int i=0; data[i] != '\0'; i++){
if(data[i]>='a' && data[i]<='z'){
numbers[data[i]-'a']++;
sort[data[i]-'a']=sort[data[i]-'a']*10+1;
}
if(data[i]>='A' && data[i]<='Z'){
numbers[data[i]-'A'+26]++;
sort[data[i]-'A']=sort[data[i]-'A']*10+2;
}
}
for(int i=0; data[i] != '\0'; i++){
if(data[i]>='a' && data[i]<='z' || data[i]>='A' && data[i]<='Z'){
int x=0;
for(x=0; numbers[x]+numbers[x+26]==0; x++);
long long so = sort[x];
int bit = 0;
while(so>10){
so/=10;
bit++;
}
if(bit){
long long all=1;
while(bit){
all*=10;
bit--;
}
sort[x]%=all;
}
else{
sort[x]=0;
}
if(so==1){
numbers[x]--;
printf("%c", x+'a');
}
else{
numbers[x+26]--;
printf("%c", x+'A');
}
}
else{
printf("%c", data[i]);
}
}
}