面试题 4,替换字符串中的空格 (字符串系列 - 替换)

咋一看很easy的问题。

但是,需要考虑到替换后的字符串比原来的字符串要长,那么就要考虑是否会占用其他内存空间的问题。

因此,首先我们需要询问考官:

是否允许在原地址上进行替换,即此字符串后是否是空余内存?

(1) 允许在原地址上替换。

解法a:

将字符串从第一个字节开始便历,遇到空格就将其替换为"%20",同时后面的字符集体向后移动2个字节。

每次替换,需要移动O(N)个字符,因此此方法的时间复杂度为O(N^2)。

 

有没有更好的解法?

解法b:

先遍历一遍字符串,计算出替换后的大小,重新分配新的内存,定义指针P,遍历原字符串,挨个复制字符,当遇到空格时,在新串中填入"%20"。

时间复杂度O(2N) = O(N)

此方法降低了复杂度,不过需要占用多余的内存。

 

有没有更好的解法?

解法c:

先遍历字符串,计算出计算出替换后的大小。

定义两个指针P1, P2,P1指针指向原字符串的末端,P2指向预估替换后的末尾位置。

随后,P1开始从末端向开端移动。每移动一个字符,就将字符复制到P2所指的位置,然后P2也向开端移动一个字符。

如果P1遇到了空格,P2向前移动三个字符,再赋值"%20"。

最后P1, P2会相遇,相遇时就是结束时。P1,P2的相遇位置可能不是字符串首部,但是只要他们相遇,就意味着再往前已经没有空格了。算法停止。

此方法时间复杂度为 O(N),空间上没有占用多余的内存。

当涉及到替换需要将字符后移的问题时,从尾部开始遍历往往是解决这个问题的好方法。

 

(2) 不允许在原地址上替换

解法同(1)b

 

 

posted on 2013-11-25 10:21  Felix Fang  阅读(878)  评论(0编辑  收藏  举报

导航