如何更高效的实现php的strrev 函数?

面试题中,经常有这样一道题目:

如何实现反转一个字符串?要求不能使用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),但是对比之前的算法来说,遍历次数少了一半,改进了很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值