7-60 删除重复字符(20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
思路:
题目自己写的时候没有什么头绪,后来在网上参考了几种不同的做法,自己又总结了一下
- 首先输入字符串的问题,用fgets()函数的话,字符串包括最后一位换行符,那么在输出的时候就要考虑这个问题了。
删除字符的方法,总结起来有两种:
- 一种是在原数组中进行改动,不定义新的数组
- 另一种是定义一个大小为256个字符的数组,用来记录每一个字符的状态,以此来筛选出重复和不重复的数组
代码:
1.
#include <stdio.h>
#include <string.h>
void removeDuplicate(char s[]);
const int n=82;
int main(void)
{
char str[n];
fgets(str,n,stdin);//得到含有回车符的字符串
removeDuplicate(str);
for(int kk=0;str[kk]!='\0';kk++)//依次输出数组的字符
{
printf("%c",str[kk]);
}
return 0;
}
void removeDuplicate(char s[])
{
int i = 0;
while (s[i] != '\0'&&s[i]!='\n')
//本来的时候没有加后面的那一句,导致输出的时候先输出了一个回车符
{
int j = i + 1;
int k = i + 1;
while (s[k] != '\0'&&s[k]!='\n')
{
if (s[k] != s[i])
{
s[j] = s[k];
++j;
++k;
}
else
{
++k;
}
}
s[j] = '\0';
++i;
}
int len=strlen(s);
//按ascii码从小到大排序
for(int ii=0;ii<len-1;ii++)
{
for(int jj=ii+1;jj<len;jj++)
{
if(s[ii]>s[jj])
{
char t=s[ii];
s[ii]=s[jj];
s[jj]=t;
}
}
}
}
2.
#include <stdio.h>
const int num= 256;
int main()
{
char str[num];
char *p = str;
fgets(str,n,stdin);//字符串中含有回车
int array[n] = {0};//定义大小为256的数组
while(*p!='\n')
{
array[*p]++;//记录每个字符出现的次数
p++;
}
int i = 0;
while(i<num)
{
if(array[i])
{
printf("%c",i);
}
i++;
}
return 0;
}