字符串替换空格 需求: 分析: c++示例代码

请实现一个函数,把字符串中的每个空格替换成"%20",例如,输入"We are happy!",则输出"We%20are%20happy!"。

分析:

思路一

直接从头开始替换。

1.从W开始遍历,找到第一空格 We后面的空格;

2.找到字符串结尾的地方,把We空格之后所有的字符串都往后移动两个位置(因为%20比空格多占两个位置);

3.把We后面的空格替换成%20,继续查找下一个空格,即重复步骤1;

4.找到最后的结束符结束循环。

从头开始替换法,由于每次遇到空格都需要把空格后面的字符往后移动2个空格,时间复杂度为O(n**2)。

见示例代码replaceSpaceFromHead

思路二

从尾部开始替换。

1.先从头开始把字符串遍历一次,统计其中的空格数量;

2.计算如果能够成功替换的话,字符的总长度是2*空格数+原始字符串长度。(因为%20比空格多占两个位置,所以多出来的长度应该是空格数的两倍);

3.从最后一个字符开始,如果字符不是空格,则一次把字符从最终的长度开始移动;

4.遇到空格,就是空格从后面的位置往前填写02%(因为是从后往前填),并且把剩余空格数减一;

5.当空格数为0或者替换到第一个字符则停止循环。

从尾开始替换法,由于只需要把原始字符串遍历2次,每次的时间复杂都都是O(n),所以整体时间复杂度为O(n),比从头开始替换法效率更高。

见示例代码replaceSpaceFromTail

扩展需求见:https://www.cnblogs.com/huangwenhao/p/11175427.html

c++示例代码

  1 #include <iostream>
  2 
  3 using namespace std;
  4 const int g_length = 100;
  5 
  6 /************************************************************************/
  7 /* @brief 从头开始替换字符串中的空格
  8 /* @param info 字符串
  9 /* @param length 字符数组的可用长度
 10 /* @return false表示替换失败,success表示替换成功
 11 /************************************************************************/
 12 bool replaceSpaceFromHead(char* info, const int length)
 13 {
 14     if (!info || length <= 0)
 15     {
 16         return false;
 17     }
 18 
 19     int bSuccess = true;
 20     int currentLen = 0;
 21     int i = 0;
 22     //从头开始查找,一直到最后一个字符
 23     while (info[i] != '