题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
#include<stdio.h>
#include<string.h>
//分别统计小写个数、大写个数
//在原数组中按字母表顺序寻找每个字母*(大小写)并写入新数组。
//寻找时利用个数作为条件可以节省时间。
//与原数组进行比较,分别输出新数组中重新排序后的字母和原数组原位置中的非字母。
//scanf遇到空格会停止,所以用结尾标志位'\n'来循环输入。
char input[1000],in,temp[1000],new[1000];
int alpha[26],beta[26];
int i=0,j=0,k=0,len,flag[26];
int main()
{
while(1)//输入数据
{
if(in != '\n')
{
scanf("%c",&in);
input[i] = in;
i++;
}
else
break;
}
len=i;//获取数组长度
for(i=0;i<len;i++)//记录出现次数
{
if((input[i]>='A')&&(input[i]<='Z')) //大写
{
alpha[input[i]-'A']++;
}
else if((input[i]>='a')&&(input[i]<='z'))//小写
{
beta[input[i]-'a']++;
}
}
for(i=0;i<26;i++)//取每一个字母
{
if(alpha[i]+beta[i]>0)//判断该字母在序列中是否存在
{
for(j=0;j<len;j++)//导入序列
{
if((input[j]==i+'A')||(input[j]==i+'a'))//按顺序寻找字母,一次只找一个字母的大小写
{
temp[k]=input[j];//将寻找到的字母放入新数组
k++;
}
}
}
}
j=0;
for(i=0;i<len;i++)//将所有数据写入数组
{
if(((input[i]>='A')&&(input[i]<='Z'))||((input[i]>='a')&&(input[i]<='z')))//字母项
{
new[i]=temp[j];//将排好顺序的字母写入按原格式填入输出数组的空字母位。
j++;
}
else//非字母项,按原数组各位置填入输出数组。
{
new[i]=input[i];
}
}
for(i=0;i<len;i++)//输出
{
printf("%c", new[i]);
}
}