原题
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
My Answer
思路分析
直接暴力替换是可以的,即两层循环实现,第一层找空格,第二层后移替换;但这种方式明显太 silly。。
方法一:
直接调用python的replace函数,代码如下:
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here】=
return(s.replace(" ", "%20"))
方法二:
我们的代码,主要消耗的时间在于,如果有多个空格, 那么每遇到一个空格就进行移位
其实前面的移位是没必要的,因为如果再遇到空格,那么之前的移位全是无用功
因此我们可以考虑先遍历一遍字符串, 计数空格的数目,
我们知道了空格的数目,其实就是知道了替换后字符串的长度,那么只需要进行一次替换就可以了
因为我们的工作变为
- 遍历一遍字符串, 统计字符出现的数目, 计算替换后的字符串长度
- 再遍历一遍字符串,完成替换
C++ Version:
class Solution {
public:
void replaceSpace(char *str,int length) {
int len_raw = length - 1;
int len_new = 0;
int count = 0;
for(int i=0; i < length; ++i){
if (str[i] == ' '){
count ++;
}
}
len_new = length + count * 2 - 1;
for(;len_raw >= 0 && len_new >= 0;){
if (str[len_raw] == ' '){
str[len_new--] = '0';
str[len_new--] = '2';
str[len_new--] = '%';
len_raw --;
}
else{
str[len_new--] = str[len_raw--];
}
}
}
};
Note
- python的
re
正则表达式匹配需要调用import re
才能使用; - C++这种需要后移替换的问题,明显从后向前遍历实现更为简便,也无需重新开辟空间。