这道题意思就是,给所有奇数放到偶数前面,我们可以设置两个指针,一个从前往后,直到他扫到偶数,一个从后往前,直到他扫到奇数,然后交换两个数的位置,然后往下扫,当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));