删除重复字符
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
#include<stdio.h>
int main()
{
char str1[85],str2[85];
gets(str1);
int n=strlen(str1),min,index,i,j,t;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(str1[i]==str1[j])
{
str1[j]='?';
}
}
}
for(i=0;i<n-1;i++)
{
if(str1[i]=='?')continue;
min=str1[i];
index=i;
for(j=i+1;j<n;j++)
{
if(str1[j]=='?')continue;
if(str1[j]<min)
{
min=str1[j];
index=j;
}
}
t=str1[i];
str1[i]=str1[index];
str1[index]=t;
}
for(i=0;i<n;i++)
{
if(str1[i]=='?')continue;
printf("%c",str1[i]);
}
return 0;
}
本题我的思路较为清晰:先用gets输入需要处理的字符串,再使用嵌套循环去将重复的字符在数组中变为一个标识字符,再使用选择排序法进行排序(也可以使用冒泡排序法),最后循环输出即可!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然而,细心的同学可能会发现,我写的这个代码实际上有个问题!!!!!!!!!!!!!!!
如果说这道题的案例中有我所设置的标识字符的话,那么我们这个代码就会自动忽略这个字符!!
下面给出另一个方法解决这个问题
#include<stdio.h>
#include<string.h>
int main()
{
char str1[85],str2[85];
gets(str1);
int n=strlen(str1),min,index,i,j,t,cn=0;
for(i=0;str1[i]!='\0';i++)
{
int flag=1;
for(j=0;j<i;j++)
{
if(str1[i]==str1[j])
{
flag=0;
}
}
if(flag) str2[cn++]=str1[i];
}
for(i=0;i<cn-1;i++)
{
for(j=0;j<cn-i-1;j++)
{
if(str2[j]>str2[j+1])
{
t=str2[j];
str2[j]=str2[j+1];
str2[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("%c",str2[i]);
}
return 0;
}
这是另外一种思路:值得注意的是这里对标示变量flag的使用,与第一种思路不一样的地方主要在于这里使用了另外一个数组在存储消除重复字符后的字符串,后面的排序我也使用了冒泡排序法供读者参考~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~