面试题中,经常有这样一道题目:
如何实现反转一个字符串?要求不能使用strrev。
常规的做法是这样的:
function str_rev($string){
$i=strlen($string)-1;
$str='';
while (isset($string[$i])){
$str.=$string[$i];
$i--;
}
return $str;
}
常规的遍历算法,复杂度为O(n),
但是有没有更高效的做法呢?当然不可能复杂度为O(1),反转字符串,也就是说,围绕某个字符进行对称翻转,
比如字符串“abcdf1234”,那么最终翻转后变成 (3421fdcba),发现无论怎么翻转,均有一个字符位置不动,比如这个字符串中的“f”,那么我们将这个字符串视为2部分,围绕这个字符'f',交换规则是这样的
$a[0]<=>$a[8]
$a[1]<=>$a[7]
$a[2]<=>$a[6]
$a[3]<=>$a[5]
那么我们可以这样写:
function str_rev($string){
$length = strlen($string);
for ($i = 0, $j = $length-1; $i < ($length / 2); $i++, $j--) {
$t = $string[$i];
$string[$i] = $string[$j];
$string[$j] = $t;
}
return $string;
}
这样复杂度依然为o(n),但是对比之前的算法来说,遍历次数少了一半,改进了很多。