程序员面试题目:请实现一个函数,把字符串中的每个空格替换成"%20"。

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。

时间复杂度为O(n2)的解法,不足以拿到Offer

现在我们考虑怎么做替换操作。最直观的做法是从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换成3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了。

举个例子,我们从头到尾把"We are happy."中的每一个空格替换成"%20"。为了形象起见,我们可以用一个表格来表示字符串,表格中的每个格子表示一个字符

程序员面试题目:请实现一个函数,把字符串中的每个空格替换成

假设字符串的长度是n。对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个空格字符的字符串而言总的时间效率是O(n^2)。

当我们把这种思路阐述给面试官后,他不会就此满意,他将让我们寻找更快的方法。在前面的分析中,我们发现数组中很多字符都移动了很多次,能不能减少移动次数呢?答案是肯定的。我们换一种思路,把从前向后替换改成从后向前替换。

时间复杂度为O(n)的解法,搞定Offer就靠它了

我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。我们还是以前面的字符串"We are happy."为例,"We are happy."这个字符串的长度是14(包括结尾符号'\0'),里面有两个空格,因此替换之后字符串的长度是18。

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int i,j,sum=0,tmp_len;
        for(i=0;i=0)
        {
            if(str[j]==' ')
            {
                j--;
                str[tmp_len--]='0';
                str[tmp_len--]='2';
                str[tmp_len--]='%';
            }
            else
            {
                str[tmp_len--]=str[j--];
            }
        }
        
	}
};


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1223

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

你可能感兴趣的:(程序员面试题目:请实现一个函数,把字符串中的每个空格替换成"%20"。)