看流星社区

 找回密码
 注册账号
查看: 1811|回复: 0

[算法练习]字符.字符串删除,字符提前

[复制链接]

该用户从未签到

发表于 2017-6-1 12:56:40 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. size_t _strlen(char *str)
  3. {
  4.         return (NULL == str || *str =='\0') ? 0 : _strlen(str+1) + 1;
  5. }
  6. //思路:只要不是星号的都交给写指针写入,忽略*
  7. //问题可以转换为:删除字符串中的特定字符 只不过这个是从尾巴开始
  8. char* str_TiQian(char *str)
  9. {
  10.         if(NULL == str || *str == '\0')
  11.                 return NULL;
  12.         int len = 0;
  13.         int Dst = 0;
  14.         int count = 0;
  15.         len = Dst = _strlen(str) - 1;
  16.         do
  17.         {
  18.                 if(str[len] != '*')
  19.                         str[Dst--] = str[len];//这里是先执行str[dst] = str[len] 然后才dst-1;
  20.                 else
  21.                         count ++;
  22.         } while (len--);
  23.         for (int i = 0; i < count; i++)
  24.         {
  25.                 str[i] = '*';
  26.         }
  27.         printf("%s\n",str);
  28.         return str;
  29. }
  30. //思路同上
  31. char* str_TiQian_Ex(char* str)
  32. {
  33.         if(NULL == str || '\0' == *str)
  34.                 return NULL;
  35.         char *pRead = 0;
  36.         char *pWrite = 0;
  37.         pRead = pWrite = str + _strlen(str) - 1;
  38.         do
  39.         {
  40.                 if(*pRead != '*')
  41.                         *pWrite-- = *pRead;
  42.         } while (pRead-- != str);//先比较再赋值
  43.         while (pRead <= pWrite)
  44.         {
  45.                 *pRead++ = '*';//先执行后面的在执行加操作
  46.                 //相当于
  47.                 //*pRead = '0';
  48.                 //pRead ++;
  49.         }
  50.         printf("%s\n",str);
  51.         return str;
  52. }
  53. char* Del_speciol_ch(char *str, char ch)
  54. {
  55.         if(NULL == str || *str == '\0')
  56.                 return NULL;
  57.         char *pRead = 0;
  58.         char *pWrite = 0;
  59.         pRead = pWrite = str;
  60.         do
  61.         {
  62.                 if(*pRead != ch)
  63.                         *pWrite++ = *pRead;
  64.         } while (*pRead++ != '\0');
  65.         printf("%s\n",str);
  66.        
  67.         return str;
  68. }
  69. char* Del_speciol_ch_Ex(char *str, char ch)
  70. {
  71.         if(NULL == str || *str == '\0')
  72.                 return NULL;
  73.         int sour = 0;
  74.         int dst = 0;
  75.         do
  76.         {
  77.                 if(str[sour] != ch)
  78.                         str[dst++] = str[sour];
  79.         } while (str[sour++] != '\0');
  80.         printf("%s\n",str);
  81.         return str;
  82. }
  83. //用数组下标标志sub字符串,同hash原理
  84. char* Del_Speciol_Str(char *str, char ch[], int n)
  85. {
  86.         if( str == NULL || *str == '\0' || n == 0 || ch[0] == '\0' )
  87.                 return NULL;
  88.         char temp[260] = {0};
  89.         for (int i = 0; i < n; ++i)
  90.         {
  91.                 temp[ch[i]] = 1;
  92.         }
  93.         int dst = 0;
  94.         int src = 0;
  95.         do
  96.         {
  97.                 if( !temp[str[src]] )
  98.                 {
  99.                         str[dst++] = str[src];
  100.                 }
  101.         } while (str[src++] != '\0');
  102.         return str;
  103. }
  104. int Del_Speciol_Str_Ex(char *str, char *substr)
  105. {
  106.         if(str == NULL || *str == '\0' || substr == NULL || substr == '\0' )
  107.                 return 0;
  108.         char *pSrc = NULL;
  109.         char *pDet = NULL;
  110.         char *p,*pSub;
  111.         pSrc = pDet = str;
  112.         int count = 0;
  113.         //O(n) + O(n)
  114.         while(*pSrc)
  115.         {
  116.                 p = pSrc;
  117.                 pSub = substr;
  118.                 while(*p && *p == *pSub)
  119.                 {
  120.                         p++;
  121.                         pSub++;
  122.                 }
  123.                 if(*pSub == '\0')//==0就说明匹配成功了 成功了就将当前的指针付给pSrc指针继续找后面还有没有匹配的字符串
  124.                 {
  125.                         pSrc = p;
  126.                         count++;
  127.                 }else
  128.                 {
  129.                         *pDet++ = *pSrc++;
  130.                 }
  131.         }
  132.         *pDet = 0;
  133.         return count;
  134. }
  135. void main()
  136. {
  137.        
  138.         /*char str0[260] = "hel*lo w*or*ld";
  139.         printf("%s\n",str0);
  140.         str_TiQian(str0);
  141.         char str1[260] = "***hel*l**o w*o**r*ld**";
  142.         printf("\n%s\n",str1);
  143.         str_TiQian(str1);
  144.         char str3[260] = "***hel*l**o w*o**r*ld**";
  145.         printf("\n%s\n",str3);
  146.         str_TiQian_Ex(str3);
  147.         char str4[260] = "hel***lo w*or*ld";
  148.         printf("\n%s\n",str4);
  149.         str_TiQian_Ex(str4);*/
  150.         /*printf("\n----------\nDel * \n");
  151.         char str5[260] = "hel***lo w*or*ld";
  152.         printf("\n%s\n",str5);
  153.         Del_speciol_ch(str5,'*');
  154.         Del_speciol_ch(str3,'*');*/
  155.         char str6[260] = "hel***lo w*or*ld";
  156.         char str7[260] = "***hel*l**o w*o**r*ld**";
  157.         printf("del_char:\n%s\n",str6);
  158.         Del_speciol_ch_Ex(str6,'*');
  159.         printf("del_char:\n%s\n",str7);
  160.         Del_speciol_ch_Ex(str7,'*');
  161.         char strTest[260] = "MallocFree is luanmaMr.Zhou";
  162.         char ch[10] = "luanma";
  163.         printf("del_chars:\n%s\n", strTest);
  164.         //Del_Speciol_Str(strTest,ch,5);
  165.         int subnum = Del_Speciol_Str_Ex(strTest, ch);
  166.         printf("%s\nSubNum:%d\n",strTest ,subnum);
  167.         getchar();
  168. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 11:18

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表