【剑指Offer学习】【面试题4 : 替换空格】

题目:

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

以下代码都是通过PHP代码实现。

 

拿到这个题目。我们第一反应就是使用内置php函数str_replace。

解法1:使用PHP内置函数

1 str_replace(" ","%20",$string);

解法2:从头遍历替换

算法:时间复杂度是O(n^2). 

我们不用php内置函数。然后自己通过php实现。则容易想到的是从头遍历字符串数组。然后遇到空格,就把后面的字符整体往后移动2格。把整体length加2.

如上图所示。我们逐次遍历。遇到空格。把wold 整体往后移动2格。然后替换%20. PHP代码实现如下。

 1 function strReplace($string){
 2     if(empty($string)) {
 3         return $string;
 4     }
 5     $length = strlen($string); //源字符串长度
 6     
 7     //遍历字符数组
 8     for ($i=0; $i < $length; $i++) { 
 9         if($string[$i] == ' ') {
10             //当前字符是空格。将后面的字符整体往后移动2格,从后往前移动。
11             for ($j=$length-1; $j > $i ; $j--) { 
12                 $string[$j+2] = $string[$j];
13             }
14             $string[$i] = '%';
15             $string[$i+1] = '2';
16             $string[$i+2] = '0';
17             //每次替换完,字符串长度加2。如果不加2 遍历到源字符串长度就是结束。目标字符串长度是大于源字符的。
18             $length = $length+2;
19         }
20     }
21     return $string;
22 
23 }

解法3:从后往前替换

算法时间复杂度:O(n)

我们可以尝试从后面往前替换。我们先算出最终字符串的长度。然后来从最终字符串的后面来比较。

大大减少了字符串数组移动的次数

PHP代码实现如下

 1 function strReplace($string){
 2     if(empty($string)) {
 3         return $string;
 4     }
 5     $length = strlen($string); //源字符串长度
 6     $spaceLenth = 0;//空格个数
 7     //获取空格的长度
 8     for ($i=0; $i < $length; $i++) { 
 9         if($string[$i] == ' ') {
10             $spaceLenth++;
11         }
12     }
13     if($spaceLenth == 0) {
14         return $string;
15     }
16     //目标字符串的长度。一个空格替换后,目标长度加2。N个空格,则增加2*N
17     $totalLen = 2*$spaceLenth+$length;
18     $length--;
19     $totalLen--;
20     while ($length >=0 && $length < $totalLen) {
21         if($string[$length] == ' '){
22             $string[$totalLen--] = '0';
23             $string[$totalLen--] = '2';
24             $string[$totalLen--] = '%';
25         }else{
26             //移动字符串
27             $string[$totalLen--] = $string[$length];
28         }
29         $length--;
30     }
31     return $string;
32 }

思考:

当我们在查找替换一个字符的时候。可以选择逆向替换。来减少移动的次数。

posted @ 2018-03-29 13:29  闲云-野鹤  阅读(333)  评论(0编辑  收藏  举报