【PHP】调整数组顺序使奇数位于偶数前(闭包扩展)

9 篇文章 0 订阅

这道题意思就是,给所有奇数放到偶数前面,我们可以设置两个指针,一个从前往后,直到他扫到偶数,一个从后往前,直到他扫到奇数,然后交换两个数的位置,然后往下扫,当begin>end的时候停止。代码实现很简单,如下:

<?php
//调整数组,使奇数位于偶数前面

function reorder($arr){
        $length = count($arr);
        $begin = 0;
        $end = $length - 1;
        while($begin < $end){
                //向后移动begin,直到它指到偶数
                while(($begin < $end) && (($arr[$end] & 0x1) != 0)){
                        $begin++;
                }

                //向前移动end,指到它指到奇数
                while(($begin < $end) && (($arr[$end] & 0x1) == 0)){
                        $end--;
                }

                if($begin < $end){
                        $temp = $arr[$begin];
                        $arr[$begin] = $arr[$end];
                        $arr[$end] = $temp;
                }
        }
        return $arr;
}

$arr = [1,2,3,4,5,6,7,8];
var_dump(reorder($arr));

上面需要注意的时,判断一个数是奇数还是偶数的时候,我用的$num & 0x1 如果等于1,则为奇数,等于0,则为偶数,效率比%要高一些。

到这里,如果单纯对于这道题,已经算是完事了。

但是如果题目一改,将所有偶数放于奇数前,你可能又要重写一个函数了。

这时,需求又改了,将所有能被3整除的放到前面………

所有负数放到前面…….

写完以上那么多函数,发现这些函数都类似啊,只有判断条件不一样。

我们可不可以将整个函数,解耦成两部分,一个是判断数字应该在函数的前半部分还是后半部分,一个是交换数组位置。

这时候我们就用到了闭包,代码如下

<?php
//调整数组,使奇数位于偶数前面

function reorder($arr, $func){
        $length = count($arr);
        $begin = 0;
        $end = $length - 1;
        while($begin < $end){
                //向后移动begin,直到它指到偶数
                while(($begin < $end) && (!$func($arr[$begin]))){
                        $begin++;
                }

                //向前移动end,指到它指到奇数
                while(($begin < $end) && ($func($arr[$end]))){
                        $end--;
                }

                if($begin < $end){
                        $temp = $arr[$begin];
                        $arr[$begin] = $arr[$end];
                        $arr[$end] = $temp;
                }
        }
        return $arr;
}

$func = function($condition){
        $flag = ($condition & 0x1) == 0;
        return $flag;
};

$arr = [1,2,3,4,5,6,7,8];
var_dump(reorder($arr, $func));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值