题目:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
链接:
答案:
暴力解决就是:从头到尾顺序遍历,每遇到一个空格,将后面的字符串往后移动2个位置,然后将空格替换为%20,每次都要移动字符串,最坏是O(n^2)。
变通的解决是:首先遍历一次,获得所有空格的数量,酱紫就知道最后的结果字符串的长度了,然后从后开始逆向遍历字符串,并往后移动即可,时间效率是O(n)。
代码:
我写的代码跟剑指offer上的代码有点不一样,哈哈,仅供参考,个人还是喜欢剑指offer上的代码。

1 //length为牛客系统规定字符串输出的最大长度,固定为一个常数 2 class Solution { 3 public: 4 void replaceSpace(char *str,int length) { 5 int spaceNum = 0; 6 int strNum = 0; 7 char *tmpStr = str; 8 while(*tmpStr != '\0'){ 9 if(*tmpStr == ' '){ 10 ++ spaceNum; 11 } 12 ++ strNum; 13 ++ tmpStr; 14 } 15 16 int sumNum = strNum + 2 * spaceNum; 17 if(sumNum > length){ 18 return; 19 } 20 21 str[sumNum] = '\0'; 22 int sumIndex = sumNum - 1; 23 while(sumIndex >= 0){ 24 if(str[sumIndex - 2 * spaceNum] == ' '){ 25 str[sumIndex--] = '0'; 26 str[sumIndex--] = '2'; 27 str[sumIndex--] = '%'; 28 -- spaceNum; 29 }else{ 30 str[sumIndex] = str[sumIndex - 2 * spaceNum]; 31 --sumIndex; 32 } 33 } 34 35 cout << str << endl; 36 } 37 };