本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
找了几个答案,没有满意的,自己调试了一会弄懂了。希望对大家有帮助。
思路:先去重,然后冒泡排序。需要考虑到空格的输入情况,不然有两个测试点过不了。有空格情况下,scanf("%s",a)的输入行不通,因为遇到空格就会停止输入。因此采用getchar一个字符一个字符的输入。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char a[80];
char ch;//用来一个一个的输入
ch=getchar();
char c;//冒泡排序,交换的中间变量
int i=0;
while(ch!='\n')
{
a[i++]=ch;
ch=getchar();
}//字符串输入完毕
int len=strlen(a);//保存下字符串长度
for(int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
if(a[i]==a[j])
{
for(int k=j;k<len;k++)//如果出现重复,数组整体前移一个单位
{
a[k]=a[k+1];
}
len--;
j--;//很关键。j必须重新回到之前的位置再比较。
}
}
}//去重完成
//冒泡排序
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(a[j]>a[j+1])
{
c=a[j];
a[j]=a[j+1];
a[j+1]=c;
}
}
}
//输出
for(int i=0;i<len;i++)
putchar(a[i]);
}