【PTA】删除重复字符

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;
}

猜你喜欢

转载自blog.csdn.net/jiangxiaoshan123/article/details/81741644