当前位置:主页 > php教程 > PHP调整奇数位于偶数前

PHP调整数组顺序使奇数位于偶数前(代码/闭包扩展)

发布:2018-10-19 17:09:14 39


给网友们整理相关的编程文章,网友黄弘量根据主题投稿了本篇教程内容,涉及到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));

 


参考资料

相关文章

  • PHP unlink与rmdir删除目录及目录下所有文件方法

    发布:2019-06-18

    这篇文章主要介绍了PHP unlink与rmdir删除目录及目录下所有文件的实例代码,需要的朋友可以参考下


  • thinkphp3.2嵌入百度编辑器ueditor实例方法

    发布:2019-06-06

    本篇文章主要介绍了thinkphp3.2嵌入百度编辑器ueditor的实例代码,具有一定的参考价值,有兴趣的可以了解一下


  • 介绍TP(thinkPHP)框架多层控制器和多级控制器的使用

    发布:2020-01-28

    这篇文章主要介绍了TP(thinkPHP)框架多层控制器和多级控制器的使用,结合实例形式分析了thinkPHP框架多层控制器和多级控制器的结构、原理及使用方法,需要的朋友可以参考下


  • php WebUploader实现图片批量上传实例方法

    发布:2019-07-01

    这篇文章主要给大家介绍了利用php + WebUploader实现图片批量上传功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PHP具有一定的参考学习价值,需要的朋友们下面来一起


  • ThinkPHP实现图片上传的方法总结

    发布:2019-06-06

    这篇文章主要介绍了ThinkPHP实现图片上传操作的方法,详细分析了thinkPHP图片上传操作的具体步骤与相关操作技巧,需要的朋友可以参考下


  • php中Magic methods的用法总结

    发布:2020-03-27

    有些东西如果不是经常使用,很容易忘记,比如魔术方法和魔术常量,这篇文章主要介绍了php魔术方法(Magic methods)的使用方法,感兴趣的小伙伴们可以参考一下


  • tp5(thinkPHP5框架)时间查询操作实例分析

    发布:2022-06-22

    给大家整理一篇关于think PHP的教程,这篇文章主要介绍了tp5(thinkPHP5框架)时间查询操作,结合实例形式分析了thinkPHP5框架数据库中日期时间查询相关操作技巧,需要的朋友可以参考下


  • PHP实现QQ快速登录方法总结

    发布:2019-06-13

    这篇文章主要为大家详细介绍了PHP实现QQ快速登录的3种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论