Problem Description
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
Mentality
由于本题要求把一个空格替换为三个字符,即%20,则在长度上,新字符串的长度变为原字符串加上两倍的空格数,可从此处解题。
1.暴力法:开辟一个新字符串,把原字符串的值复制进去。首先遍历一遍原字符串,得出原长度和空格数,算出新字符串的长度。然后遇到不是空格的字符就直接拷贝,遇到的是空格就放入“%20”。
由于暴力法消耗空间大,可以换个思路,减少空间开销。暴力法是从前往后遍历,可以改成从后往前遍历。由于本题给出了length,即原字符串str最大的空间,只要新字符串长度在此范围内,就可以不用开辟新空间,从后往前遍历,遇到不是空格的字符就直接往后挪,遇到的是空格就放入“%20”。
2.改进:和暴力法一样,要先遍历一遍原字符串,得出原长度和空格数,算出新字符串的长度。定义两个指针p1、p2,分别指向原字符串末尾和新字符串末尾,将新字符串末尾置为’\0’,然后开始从后向前遍历。若p1指向空格,则p2位置向前复制“%20”,否则将字符复制到p2指向的位置。直到p1=p2,说明复制完毕。
Code (C++)
class Solution {
public:
void replaceSpace(char *str,int length) {
int ori_len;
int blank(0);
for(ori_len=0; str[ori_len]!='\0'; ori_len++)
if(str[ori_len]==' ')
blank++;
int new_len=ori_len+blank*2;
str[new_len]='\0';
int p1=ori_len-1,p2=new_len-1;
while(p1>=0&&p2>p1){
if(str[p1]==' '){
str[p2--]='0';
str[p2--]='2';
str[p2--]='%';
}
else
str[p2--]=str[p1];
p1--;
}
}
};
已通过所有的测试用例,欢迎指正批评(´▽`ʃ♡ƪ)
本文介绍了一种将字符串中空格替换为“%20”的算法实现,详细讲解了暴力法和改进后的空间优化方法,并提供了C++代码示例。

被折叠的 条评论
为什么被折叠?



