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

来源:互联网 发布:最小公约数算法 编辑:程序博客网 时间:2024/04/29 17:36

     这是华为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);}


经过网友的好心指导,下来又认真的想了下这个算法确实要高效很多
#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;    }   


0 1
原创粉丝点击