当前位置:首页 » 面试笔试 » 正文

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

2446 人参与  2019年03月01日 17:30  分类 : 面试笔试  评论

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

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

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

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

image.png

假设字符串的长度是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<length;i++)
        {
            if(str[i]==' ')
            {
                sum++;
            }
        }
        tmp_len = length+2*sum-1;
        j=length-1;
        while(j>=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

数据结构  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>

网站分类

标签列表

最近发表

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

本站资源大部分来自互联网,版权归原作者所有!