PHP面试题精选5——替换空格

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

对于该题,我们的第一想法是顺序遍历字符串,遇到空格字符时,将空格替换成“20%”,因为字符串长度变长了,因此替换前,要先将空格后面的字符串全部后移两位,再做替换。该思路的算法复杂度为O(n^2);

显然面试官对这个思路并不会满意,他会问你有没有更高效的思路。其实我们这个思路最大的问题是,每遇到一个空格,后面所有的字符串都要移动一次,造成了很多字符串多次移动,如果能每个字符都移动一次,那效率就会高很多。

我们换个思路,从后往前移动,让每个字符一次性移到它最终要移到的位置,就不会重复移动了。我们先遍历一遍字符串,得到字符串长度和其中空格的个数。由此可以计算出替换后字串的总长度。设两个指针P1,P2,P1指向原字符串尾,P2指向替换后字符串尾。逐个向前移动P1,把P1所指字符移动到P2,P2也跟着前移。当遇到空格时P1移动1格,把%20填充到P2前面,P2前移3格。这样就能实现O(n)复杂度的替换。

实现代码如下:

function replaceSpace($str)
{
    $len = strlen($str);
    $objStr = '';
    
    for($i=$len-1; $i>=0; $i--)
    {
        if($str[$i] == ' ')
            $objStr = '%20'.$objStr;
        else
            $objStr = $str[$i].$objStr;
    }
    
    return $objStr;
}

你可能感兴趣的:(PHP面试题精选5——替换空格)