【牛客 - 剑指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;
    }
}

方案二 插入排序思想

用变量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. 创建一个新数组,长度和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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值