题目描述 :字符串排序_牛客题霸_牛客网
这道题我的思路是,将原来字符串中的大小写字母先摘出来,存入一个临时字符数组中,存放的同时,将大写字母换成相应的小写字母,小写字母保持不变,因为字母排序与大小写无关,这样操作方便排序,至于排序算法,选一个稳定的排序算法即可,本题采用冒泡算法,同时用flag数组存放是否转换的信息,若字符未转换,flag[i]为0,转换记录为1;
以上操作将原字符串中的所有字母都排序好了,此时遍历原来的字符串,如果是字母就按排好序的字符数组数据依次填入,如果是非字母保持不变,同时在填入的过程中注意把原来大写改小写的字母换回来,标志就是看flag是否为1。
以下为代码实现:
#include <stdio.h>
#include <string.h>
#define N 1000
int main()
{
char str[N],temp[N],ch;
int i,j,k,len,flag[N]={0},m='a'-'A',f;
gets(str);
len=strlen(str);
for(i=0,j=0;i<len;i++)
{
if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))
{
if(str[i]>='A'&&str[i]<='Z')
{
temp[j]=str[i]+m;
flag[j]=1;
}
else
{
temp[j]=str[i];
}
j++;
}
}
k=j;
for(i=0;i<k-1;i++)
{
for(j=0;j<k-1-i;j++)
{
if(temp[j]>temp[j+1])
{
ch=temp[j];
temp[j]=temp[j+1];
temp[j+1]=ch;
f=flag[j];
flag[j]=flag[j+1];
flag[j+1]=f;
}
}
}
for(i=0,j=0;i<len;i++)
{
if(!((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')))
{
continue;
}
else
{
if(flag[j]==1)
{
temp[j]-=m;
}
str[i]=temp[j];
j++;
}
}
printf("%s\n",str);
return 0;
}