替换空格:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

剑指offer替换空格:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

思路:当我们从前往后进行替换时,每替换一个就要移动后面的所有字符,时间复杂度是0(n2)

我们可以从后向前替换,先统计出所有的空格数space_count,就能得到替换后的长度是length+2*space_count

定义两个指针(可以用下标表示),i指向替换前的最后一个字符下标,j指向替换后的最后一个字符下标

从后向前复制。

 1 //请实现一个函数,将一个字符串中的每个空格替换成“%20”。
 2 //例如,当字符串为We Are Happy.
 3 //则经过替换之后的字符串为We%20Are%20Happy。
 4 #include <iostream>
 5 #include <cstring>
 6 #include <cstdlib>
 7 using namespace std;
 8 
 9 
10 class Solution {
11 public:
12     //思路首先找出统计所有的空格数,这样就能计算出替换后的字符串长度
13     // 然后从后向前替换
14     void replaceSpace(char *str, int length)
15     {
16         if(length <= 0 || str == nullptr)
17             return ;
18 
19         int space_count  = 0;
20         for(int i = 0; i < length; i++)
21         {
22             if (str[i] == ' ')
23                 space_count++;
24         }
25 
26         int i = length-1; //替换前最后一个字符下标
27         int j = length+space_count*2-1; // 替换后最后一个字符的下标
28         while(j >= 0)
29         {
30             if (str[i] == ' ')
31             {
32                 str[j--] = '0';
33                 str[j--] = '2';
34                 str[j--] = '%';
35                 i--;
36             }
37             else
38                 str[j--] = str[i--];
39         }
40     }
41 };
42 
43 
44 int main(void)
45 {
46     char str[] = "as df kls";
47     // char str[] = "hello"和char *str = "hello"不一样
48     Solution s;
49     s.replaceSpace(str, strlen(str));
50     return 0;
51 }
原文地址:https://www.cnblogs.com/xiaokang01/p/12397215.html