• 题目描述:

请实现一个函数,将一个字符串中的空格替换成“%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;
        }
	}
};
 posted on 2017-04-24 13:34  Bill_LHR  阅读(321)  评论(0编辑  收藏  举报