面试中经常会有这道题。只要思路明晰,可以轻松写出来。
首先,php自带了一个字符串颠倒顺序的函数。
代码:
1 2 3 | $str = 'To Change The template'; echo strrev($str); // 结果:etalpmet ehT egnahC oT |
其次,使用递归函数实现。当然效率很低!
代码:
1 2 3 4 5 6 7 8 | function reverse_r($str) { if (strlen($str) > 0){ reverse_r(substr($str, 1)); } echo substr($str, 0, 1); return; } echo reverse_r($str); |
第三,使用循环实现,效率有很大的提高。
代码:
1 2 3 4 5 6 7 8 9 10 | /** * 利用循环实现字符串逆序排列 */ function reverse_i($str){ for ($i = 1; $i < = strlen($str); $i++){ echo substr($str, -$i, 1); } return; } echo reverse_i($str); |
最后,使用二分法实现,效率有更大的提高。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * 使用二分法来实现字符串颠倒顺序。 */ function reverse_a($str){ $forNum = ceil(strlen($str)/2); $strLen = strlen($str); for ( $i = 1; $i < = $forNum; $i++) { if($i <= $strLen-$i){ $tmp = $str[$i-1]; $str[$i-1] = $str[$strLen-$i]; $str[$strLen-$i]= $tmp; } } return $str; } // 注:其实按照二分法来实现,理论上效率会提升一半,但是这个涉及 //到数组的指针操作,实际效率会怎样?难说。 echo "二分实现:\t",reverse_a($str); |
最后一种方法涉及到三个知识点:
1. ceil()函数:进一法取整。如:5/4=1.25,ceil(5/4)=2,不管小数位是否大于0.5,均进一取整。
2. 字符串当成数组访问,如$str[0],$str[1]...可以访问字符串$str的第一个字符、第二个字符...
3. 二分法。方法3需要循环的次数是字符串的长度,而方法4则是字符串长度的一半,所以效率会提高一倍(理论上)。