给网友们整理相关的编程文章,网友黄弘量根据主题投稿了本篇教程内容,涉及到PHP、数组顺序、奇数、偶数、PHP调整奇数位于偶数前相关内容,已被220网友关注,涉猎到的知识点内容可以在下方电子书获得。
PHP调整奇数位于偶数前
php如何实现原址排序数组使奇数位于偶数前面(代码)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1、遍历数组,判断元素奇数偶数,push进新数组,空间换时间
2、插入排序的思想 空间上是原址排序
2.1从前往后遍历,判断当前的是奇数
2.2从当前的开始,从后往前遍历,如果是偶数就往后一位移动
2.3当前奇数插入位置
for i=1;i<arr.length;i++ target=arr[i] if arr[i]%2==1 j=i-1 while j>=0&&arr[j]%2==0 arr[j+1]=arr[j] j-- arr[j+1]=target
<?php $arr=array(1,2,3,4,5,6,7,8,9,10); function reOrderArray($arr){ $length=count($arr); //从前往后遍历 for($i=1;$i<$length;$i++){ //判断当前元素是奇数 $target=$arr[$i]; if($target%2==1){ //从后往前遍历,如果有偶数就往后移动一位 $j=$i-1; while($j>=0 && $arr[$j]%2==0){ $arr[$j+1]=$arr[$j]; $j--; } //把奇数插入位置 $arr[$j+1]=$target; } } return $arr; } $arr2=reOrderArray($arr); var_dump($arr2);
array(10) { [0]=> int(1) [1]=> int(3) [2]=> int(5) [3]=> int(7) [4]=> int(9) [5]=> int(2) [6]=> int(4) [7]=> int(6) [8]=> int(8) [9]=> int(10) }
调整数组顺序使奇数位于偶数前(闭包扩展)
这道题意思就是,给所有奇数放到偶数前面,我们可以设置两个指针,一个从前往后,直到他扫到偶数,一个从后往前,直到他扫到奇数,然后交换两个数的位置,然后往下扫,当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));