通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

     这是华为2013的一个机试题,会好半天才想出来,用了三个for循环,可能有点繁琐,但只要慢慢看还是好理解的,

题目:

      通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”

#include<stdio.h>
#include<string.h>
void main()
{
	char a[]="abacacde";
	int length=strlen(a);//首先求长度

	for(int i=0;a[i]!='\0';i++) //先确定要一个字符
	{
		for(int j=i+1;j<length;j++) //检索当前位置的值和后面的所以值进行检索
		{
			if(a[i]==a[j])   //确定一个值后与整个字符串每一个字符进行比较
			{
				for(int k=0;k<length-j;k++)//移动删除j位置的值
				{
					a[j+k]=a[j+k+1];
				}
				length--;//删除一个后长度减一
				j=j-1; //退回到j开始的位置,因为跳出if后j会自加一次,所以要先减1
			}
		}
	}
	printf("%s\n",a);
}

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。_第1张图片
经过网友的好心指导,下来又认真的想了下这个算法确实要高效很多
#include <stdio.h>    
#include<stdlib.h>   
#include<string.h>
void string(const char *str, long length, char *t_str)  
{  
    int arr[26]={0}; //计数器  
    char ret;  
    int j=0;  
    for(int i=0;i<length;i++)  
    {  
        ret =str[i]-'a';  
        if(arr[ret]==0)  
        {  
            t_str[j++] =str[i];
			arr[ret]=1;  
        }  
    }  
    t_str[j] = '\0';  
}  
    
void main()    
{    
    char  *str = "abcccbbbdgf";    
    int length = strlen(str);      
    char * ret = (char *)malloc((length+1)*sizeof(char));  
    
    string(str,length,ret);     
    printf("ret=%s\n",ret);    
    free(ret);    
    ret = NULL;    
}   


你可能感兴趣的:(字符串过滤程序)