字符串替换空格

Posted huangwenhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串替换空格相关的知识,希望对你有一定的参考价值。

需求:

请实现一个函数,把字符串中的每个空格替换成"%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

 

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] != \\0)
 24     
 25         //如果是空格,开始替换
 26         if (info[i] ==  )
 27         
 28             int j = i;
 29             //找到字符串的末尾
 30             while (info[j] != \\0)
 31             
 32                 ++j;
 33             
 34             //长度不够了,失败。新长度是索引加上增加的两个字符加上1
 35             if (j + 2 + 1 >= length)
 36             
 37                 bSuccess = false;
 38                 break;
 39             
 40             //把每个字符往后活动两个位置
 41             while (j > i)
 42             
 43                 info[j + 2] = info[j];
 44                 --j;
 45             
 46             //把当前的空格替换成%20然后继续查找下一个空格
 47             info[i] = %;
 48             info[i + 1] = 2;
 49             info[i + 2] = 0;
 50             i += 2;
 51         
 52         //如果不是空格继续找下一个
 53         else
 54         
 55             ++i;
 56                 
 57     
 58     return bSuccess;
 59 
 60 
 61 /************************************************************************/
 62 /* @brief 从尾开始替换字符串中的空格
 63 /* @param info 字符串
 64 /* @param length 字符数组的可用长度
 65 /* @return false表示替换失败,success表示替换成功
 66 /************************************************************************/
 67 bool replaceSpaceFromTail(char* info, const int length)
 68 
 69     if (!info || length <= 0)
 70     
 71         return false;
 72     
 73 
 74     int bSuccess = true;
 75     int currentLen = 0;
 76     int i = 0;
 77     int spaceNum = 0;
 78     //查看有多少个空格
 79     while (info[i] != \\0)
 80     
 81         if (info[i] ==  )
 82         
 83             spaceNum += 1;
 84         
 85         ++i;
 86     
 87 
 88     //最终长度是索引加上增加的两个字乘空格数符加上1
 89     int newLen = i + spaceNum * 2 + 1;
 90     //长度不够直接返回替换失败
 91     if (newLen > length)
 92     
 93         return false;
 94     
 95 
 96     //当空格数为0就可以停止循环了
 97     for (int j= newLen; spaceNum > 0 && i > 0; --i)
 98     
 99         if (info[i] !=  )
100         
101             info[j] = info[i];
102             --j;
103         
104         else
105         
106             //把当前的空格替换成%20然后继续查找下一个空格
107             info[j] = 0;
108             info[j - 1] = 2;
109             info[j - 2] = %;
110             j -= 3;
111             spaceNum -= 1;
112         
113     
114 
115     return bSuccess;
116 
117 
118 int main()
119 
120     char szInfo[g_length] =  "We are happy!" ;
121     char szInfo1[g_length] =  "We are happy!" ;
122 
123     cout << "原始字符串:" << endl << szInfo << endl;
124 
125     bool success = replaceSpaceFromHead(szInfo, g_length);
126     
127     cout << endl << "从头开始替换法:" << endl;
128     if (success)
129     
130         cout << szInfo << endl;
131     
132     else
133     
134         cout << "替换失败" << endl;
135     
136 
137     success = replaceSpaceFromTail(szInfo1, g_length);
138 
139     cout << endl << "从尾开始替换法:" << endl;
140     if (success)
141     
142         cout << szInfo << endl;
143     
144     else
145     
146         cout << "替换失败" << endl;
147     
148     
149     cout << endl;
150 
151     return 0;
152 

 

测试结果

技术图片

 

以上是关于字符串替换空格的主要内容,如果未能解决你的问题,请参考以下文章

替换空格

如何替换掉字符串里的空格?

替换空格

替换空格

替换空格

字符串替换空格