面试题 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
------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2013-11-25 10:21 Felix Fang 阅读(878) 评论(0) 编辑 收藏 举报