前两天看到一个文章白板编程浅谈——Why, What, How里说“原地消除字符串的重复空白(例:"ab   c  d e" => "ab c d e")则是一道合格的题目,因为即便不使用库函数,合格的面试者也能够在 20 分钟内完成这道题目。” 就试着自己写了下这个功能的实现。

  思路:因为题目限制了是原地,而不能借助一个辅助临时数组。所以第一想法可能会想到,从前往后遍历,遇到连续空白就将后面的内容全部向前移动,这样的确可以很快的写出来,但是时间复杂度就比较大了(0(n^2))。所以就想到用两个游动指针来标记已经遍历到的当前位置pRight和删除空白后当前位置pLeft。

  一、首先呢,我考虑写一个删除字符串中所有空格(当然特定其他字符也是一样的),就写了下面的代码:

 1 //删除字符数组str中的所有某个特定字符del
 2 char * delChar(char* str, char del = ' ')
 3 {
 4     //防止传入无效参数-空指针
 5     if(str==0 || *str==0 || del==0)
 6         return str;
 7     char *pLeft=str, *pRight=str;
 8     while(*pRight!=0 && *pRight!=del)
 9         ++pRight;
10     pLeft = pRight;//第一个要删的位置
11     while(*pRight==del) //跳过要删除的元素
12         ++pRight;
13     //当前pRight指向第一个要向前移动的元素
14     for(;*pRight!=0;++pRight) {
15         //*pRight不需要删除则向前复制元素
16         if(*pRight!=del) {
17             *pLeft = *pRight;
18             ++pLeft;
19         }
20     }
21     *pLeft = 0;
22     return str;
23 }
View Code

相关文章:

  • 2021-11-22
  • 2022-12-23
  • 2021-10-09
  • 2022-01-27
  • 2021-06-08
  • 2021-11-17
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-22
  • 2021-07-30
相关资源
相似解决方案