• 【牛客 - 剑指offer】JZ21 调整数组顺序使奇数位于偶数前面(一) 三种方案 Java实现



    剑指offer题解汇总 Java实现

    https://blog.csdn.net/guliguliguliguli/article/details/126089434

    本题链接

    知识分类篇 - 其他算法 - JZ21 调整数组顺序使奇数位于偶数前面(一)

    题目

    在这里插入图片描述

    思路 & 代码

    方案一 计算奇数的个数

    1. 创建一个长度和array数组长度一样的新数组res
    2. 遍历数组,计算出奇数的个数odd
    3. 定义两个指针,x=0,y=odd。从下标0至odd-1一共odd个数,正好存储odd个奇数
    4. 遍历数组,如果当前值是奇数,那么存储在res[x]的位置;如果当前值是偶数,那么存储在res[y]的位置
    5. 返回res数组
    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * @param array int整型一维数组
         * @return int整型一维数组
         */
        public int[] reOrderArray(int[] array) {
            // write code here
            int[] res = new int[array.length];
            int odd = 0;
            for (int value : array) {
                if ((value & 1) != 0) {
                    odd++;
                }
            }
            int x = 0;
            int y = odd;
            for (int value : array) {
                if ((value & 1) != 0) {
                    res[x++] = value;
                } else {
                    res[y++] = value;
                }
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    方案二 插入排序思想

    用变量j来记录下标为j之前的内容以全部存放了奇数

    变量temp用来记录当前循环中数组的值

    • 如果当前值是偶数,则跳过
    • 如果当前值是奇数,则将从j下标开始,到当前数组位置之前(下标是j-1)的数全部往后移一位,也就是说,把当前位置上的这个奇数放到j下标的位置,其余数字全部往后移一位

    【举例】
    j=2,表示数组中下标0、1的位置已经全部摆放了奇数,如果后面有再遇到奇数,则放置在下标为2的位置

    j=2,当前数组是[1, 3, 2, 4, 5]
    循环到i=4的时候,array[4]=5,5是奇数
    用变量temp保存一下array[4]这个值5
    所以要把从下标2到下标3的数往后移一位,[1, 3, 2, 2, 4]
    然后,把temp赋值给array[j],[1,3,5,2,4]

    import java.util.*;
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * @param array int整型一维数组
         * @return int整型一维数组
         */
    //使用插入排序的思想
        public int[] reOrderArray(int[] array) {
    
            // 首先是对数值长度进行特判
            if (array == null || array.length == 0)
                return array;
    
            //记录已经是奇数的位置
            int j = 0;
            int temp = 0;
    
            for (int i = 0; i < array.length; i++) {
    
                temp = array[i];
    
                //如果该值为偶数
                if (array[i] % 2 == 0) {
                    continue;
                }
                //该值为奇数
                int k = i;
                while (k > j) {
                    //这区间整体向后移动一位
                    array[k] = array[k - 1];
                    k--;
                }
                //移位之后将对应的值赋值
                array[k] = temp;
                j++;
    
            }
            //返回结果数数组
            return array;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    方案三 双指针

    1. 创建一个新数组,长度和array长度一致
    2. 定义四个指针
      • 其中两个指向原数组的首和尾
      • 另外两个指向新数组中的首和尾
    3. left指针从左向右遍历数组,right指针从右向左遍历数组
      • left指针遇到奇数,则从res数组的左边开始添加
      • right指针遇到偶数,则从res数组的右边开始添加
    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * @param array int整型一维数组
         * @return int整型一维数组
         */
        public int[] reOrderArray(int[] array) {
            // write code here
            int[] res = new int[array.length];
            int left = 0, right = array.length - 1;
            int res_left = 0, res_right = res.length - 1;
    
            while (left < array.length && right >= 0) {
                if ((array[left] & 1) != 0) {
                    res[res_left++] = array[left];
                }
                left++;
                if ((array[right]&1)==0){
                    res[res_right--] = array[right];
                }
                right--;
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    使用c#强大的表达式树实现对象的深克隆之解决循环引用的问题
    Scala——While和do..While循环控制
    ECC算法,邮件系统安全防护的“得力助手”
    问题记录(待解决)|由 apt install nvidia-cuda-toolkit 引发的灾难
    uview+uniapp+springboot 实现小程序上传图片并回显
    Prometheus+Grafana搭建Jmeter性能监控平台(2)
    在开发人力资源管理 HRM 系统?试试低代码
    2021年中国研究生数学建模竞赛B题——空气质量预报二次建模
    DBNet:具有可微分二值化的实时场景文本检测
    2、vscode c++ 项目配置调试及运行
  • 原文地址:https://blog.csdn.net/guliguliguliguli/article/details/126697435