C++ 中的替换空格

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

分析:

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

我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾(如图(a)所示)。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串包含如图(b)所示,灰色背景的区域是做了字符拷贝(移动)的区域。碰到第一个空格之后,把Pl向前移动1格,在P2之前插入字符串”%20″。由于”%20″的长度为3,同时也要把P2向前移动3格如图(c)所示。

我们接着向前复制,直到到碰到第二个空格(如图2.4(d)所示)。和上次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20″(如图2.4(e)所示)。此时P1和P2指向同一位置,表明所有空格都已经替换完毕。   从上面的分析我们可以看出,所有的字符都只复制(移动)一次,因此这个算法的时间效率是O(n),效率比较高。

注:图中带有阴影的区域表示被移动的字符。

(a)把第一个指针指向原字符串的末尾,把第二个指针指向替换之后的字符串的末尾。

(b)依次复制字符串的内容,直至第一个指针碰到第一个空格。

(c)把倒数第一个空格替换成”%20″,接着,把第一个指针向前移动1格,把第二个指针向前移动3格。

(d)依次向前复制字符串中的字符,直至碰到空格。

(e)替换字符串中的倒数第二个空格,接着,把第一个指针向前移动1格,把第二个指针向前移动3格。

在面试的过程中,我们也可以和前面的分析一样,画一两个示意图,解释自己的思路,这样既能帮助我们理清思路,也能使我们和面试官的交流变得更加高效。在面试官肯定我们的思路之后,就可以开始写代码了。下面是参考代码:

测试用例:

1)输入的字符串中包含空格(空格位于字符串的最前面,空格位于字符串的最后面,空格位于字符串的中间,字符串中有连续多个空格)。
2)输入的字符串中没有空格。
3)特殊输入测试(字符串是个NULL指针、字符串是个空字符串、字符串只有一个空格字符、字符串中只有连续多个空格)。

//测试代码:

//主函数

效果如下:

参考文献:何海涛.《剑指Offer名企面试官精讲典型编程题》.2012年.电子工业出版社

1 1 收藏 1 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部