[转]去掉字符串中重复的字符 --- 华为笔试题

来源:互联网 发布:龙之信条萝莉捏脸数据 编辑:程序博客网 时间:2024/05/22 06:14

转载:http://blog.csdn.net/vincent040/article/details/6902631

题目如题所示,将 “google” 弄成“gole”

// strip.c  #include <stdio.h>  #include <string.h>  #define REDUNDANT -1  void strip(char *str)  {      if(str == NULL)          return;          int i, j;      char *p = str;          // mark all redundant letters      for(i=1; str[i] != '\0'; i++)      {          for(j=0; j<i; j++)          {              if(p[j] == str[i])              {                  str[i] = REDUNDANT;                  break;              }          }      }          /*     ** locate the first redundant letter and     ** the first common letter after it.     */      int redun = 0, common = 0;      for(i=1; str[i] != '\0'; i++)      {          if(str[i] != REDUNDANT)              continue;              redun = i;          while(str[i] == REDUNDANT)              i++;              common = i;          break;      }          // no repeat letter      if(redun == 0)          return;          /*     ** move all common letters forward     */      while(str[common] != '\0')      {          if(str[common] == REDUNDANT)          {              common++;              continue;          }          str[redun++] = str[common];          str[common++] = REDUNDANT;      }          str[redun] = '\0';  }  int main(void)  {      char buf[64];      fgets(buf, 64, stdin);          strip(buf);      printf("%s", buf);          return 0;  }  

/*这个是我自己实现的,不过标记那部分,还是林老师的比较精辟点*/

#include <stdio.h>#define FLAG -1void strip(char *buf){int i = 0;int j = 0;int temp = 0;if (buf == NULL)return;/*标记重复字符*//*for (i=0; buf[i] != '\0'; i++){for (j=0; buf[j] != '\0'; j++) {if (i == j){continue;}else{if ((buf[i] == buf[j]) && (buf[j] != FLAG)){buf[j] = FLAG;}}}}*/        /*标记重复字符*/for(i=1; buf[i] != '\0'; i++)  {  for(j=0; j<i; j++)  {  if(buf[j] == buf[i])  {  buf[i] = FLAG;  break;  }}  }/*找字符 --> 填坑*/for (i=0; buf[i] != '\0'; i++) {/*找坑*/if (buf[i] != FLAG){continue;}/*保存现场*/temp = i;i++;/*找字符*/while (buf[i] == FLAG){i++;}/*开始填坑*/if (buf[i] != '\0'){buf[temp] = buf[i];buf[i] = FLAG;}else/*提前退出填坑*/{buf[temp] = '\0';return;}/*恢复现场*/ i = temp;}buf[temp+1] = '\0';} int main(void){char buf[64] = {0};fgets(buf, 64, stdin);strip(buf);printf("%s\n", buf);return 0;}


0 0
原创粉丝点击