- 题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- 分析:
首先,还是想到简单、原始的方法,从头到尾扫描字符串,遇到每遇到一次空 格,先将空格之后的所有元素移动两个字节,然后将空格替换成”%20“。显然这种方法需要大量移动字符。假设字符串的长度是n,每遇到一个空格,需要移动O(n)个字符,因此对含有O(n)个空格的字符串而言,时间复杂度为O(n^2)。
时间复杂度为O(n)的解法:
首先遍历一次字符串,这样就可以得到字符串的长度originallength
,并统计出其中空格字符的个数space
,相加得到替换后的字符串长度newlength
。然后定义两个指针P1、P2,分别指向原字符串的最后一个元素(注意,字符串的长度中不包含'\0',但实际上它也占一位),接下来就可以向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,同时也将P2向前移动一位。当碰到空格的时候,把P1向前移动一位,将“%20”插入P2之前的三位,并将P2向前移动三位。重复此过程,直到P2和P1指向同一位置时,表明所有空格都已替换完毕。
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str == NULL || length <= 0)
return;
int originallength = 0;
int space = 0;
for(int i = 0; str[i] != '\0';++i){
++originallength;
if(str[i] == ' ')
++space;
}
//将空格替换成“%20”后,每有空格,则长度比原来增加2
int newlength = originallength + space * 2;
if(length < newlength + 1)
return;
int p1 = originallength;
int p2 = newlength;
while(p1 >= 0 && p2 > p1){
if(str[p1] == ' '){
str[p2--] = '0';
str[p2--] = '2';
str[p2--] = '%';
}
else{
str[p2--] = str[p1];
}
--p1;
}
}
};
晚来天欲雪,能饮一杯无?