题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
由于我在实现的时候使用的是C++的string,所以从后往前复制和从前往后复制,时间复杂度是一样的。
如果使用char*数组实现,则从后往前复制更高效。
重点是掌握这种反向思维。
class Solution {
public:
string replaceSpace(string s) {
// 1.找出s中空格的个数,确定新string的长度
// 2.反向遍历s,依次确定新string的各个元素
int countBlank = 0;
for(auto i = 0; i < s.size(); ++i){
if(s[i] == ' ')
countBlank++;
}
// 初始化新string
string res(s.size() + 2 * countBlank, 'a');
// 必须将size_t类型转为int,不然i始终非负,无法结束循环
for(auto i = int(s.size())-1, j = int(res.size())-1; i >= 0; --i, --j){
if(s[i] == ' '){
res[j] = '0';
res[j-1] = '2';
res[j-2] = '%';
j -= 2;
}else
res[j] = s[i];
}
return res;
}
};
附Char*数组版本:
class Solution {
public:
void replaceSpace(char *str,int length) {
if(length <= 0)
return;
char* p = str;
int count = 0;
int valid_length = 0;
while(*p != '\0'){
if(*p == ' ')
++count;
++p;
++valid_length;
}
char* pEnd = str + valid_length + 2 * count;
if(valid_length + 2 * count > length)
return;
*pEnd = '\0';
while(valid_length--){
--p;
--pEnd;
if(*p == ' '){
*pEnd-- = '0';
*pEnd-- = '2';
*pEnd = '%';
}else{
*pEnd = *p;
}
}
}
};