题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为
We%20Are%20Happy。
开始想的是创建一个新的string对象,一边遍历,赋值,然后让原来的指针指向这个新的字符串,但是定睛一看,函数返回为void。。。只得在原串上修改了,但是,每遇到一个空格,为了避免覆盖,就要把空格后面的字符都往后移动两个字符。可能要移动多次,时间复杂度o(n^2)。
换种思路:把从前向后替换变成从后向前替换。
首先遍历一次,统计总空格数以确定转换后的字符总数。还有就是注意边界条件。
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str == NULL || length <= 0)
return;
char *p1, *p2;
int count = 0;
for(int i = 0; i < length; i++)
if(str[i] == ' ') count++;
p1 = &str[length-1];
p2 = &str[length-1+2*count];
for(int i = 0; i < length+2*count; i++)
{
if(*p1 != ' ')
{
*p2 = *p1;
p2--;
}
else
{
*p2 = '0';
*(--p2) = '2';
*(--p2) = '%';
p2--;
}
p1--;
}
}
};
举一反三:
合并两个数组(或字符串)时,如果从前往后复制每个数字(或字符),需要重复移动多次。可以考虑从后往前复制,提高效率。