【剑指Offer】调整数组顺序使奇数位于偶数前面

本文介绍了一种算法,用于调整整数数组中奇数和偶数的位置,使得所有奇数位于数组的前半部分,所有偶数位于后半部分。提供了两种方法实现此目标:一种使用双指针直接交换元素,另一种通过解耦判断逻辑和数组操作提高扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

第一种方法是定义两个指针,分别从数组的前和后开始扫描数组,如果第一个指针指向的数字是偶数,第二个指针指向的数字是奇数,则交换着两个数字,并确保第一个指针始终在第二个指针前面。

第二种方法是一种可扩展的解法,即用一个单独的函数来判断数字是不是符合标准,也就是将整个函数解耦成两部分:一部分是用来判断数字应该在数组的前半部分还是后半部分,另一部分是拆分数组的操作。

代码实现(Java)

package jianzhioffer;

import java.util.Scanner;

public class ReOrderArray {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String[] str = scanner.nextLine().split(",");
            int[] num = new int[str.length];
            for (int i = 0; i < str.length; i++) {
                num[i] = Integer.parseInt(str[i]);
            }
            reOrderArray(num);
            for (int i = 0; i < num.length; i++) {
                System.out.print(num[i]+" ");
            }
        }
        scanner.close();
    }

    /**
     * 方法1:使用两个指针,分别从前和从后扫描数组,如果遇到前偶后奇,则交换
     * @param array
     */
//    private static void reOrderArray(int[] array) {
//        if (array==null||array.length==0){
//            return;
//        }
//        int begin = 0;
//        int end = array.length-1;
//        while (begin<end){
    //向后移动begin,直到它指向偶数
//            while (begin<end&&(array[begin]&0x1)!=0){
//                begin++;
//            }
    //向前移动end,直到它指向奇数
//            while (begin<end&&(array[end]&0x1)==0){
//                end--;
//            }
//            if (begin<end){
//                int temp = array[begin];
//                array[begin] = array[end];
//                array[end] = temp;
//            }
//        }
//    }

    /**
     * 方法2:可扩展的解法
     * 把这个函数解耦成两部分:一是判断数字应该在数组前半部分还是后半部分的标准;二是拆分数组的操作
     * @param array
     */
    public static void reOrderArray(int[] array){
        if (array==null||array.length==0)
            return;
        int begin = 0;
        int end = array.length-1;
        while (begin<end){
            if (isEven(array[begin])&&!isEven(array[end])){
                int temp = array[begin];
                array[begin] = array[end];
                array[end] = temp;
            }else if (!isEven(array[begin])&&isEven(array[end])){
                begin++;
            }else if (isEven(array[begin])&&isEven(array[end])){
                end--;
            }else {
                begin++;
                end--;
            }
        }
    }
    public static boolean isEven(int n){
        return (n&1)==0;
    }
}

上面的代码不能保证奇数和奇数、偶数和偶数之间的相对位置不变。

如何解决这个问题呢?

可以采用类似冒泡排序的算法,前偶后奇就交换

    /**
     * 判断一个数是不是偶数
     * @param n
     * @return
     */
    public static boolean isEven(int n) {
        return (n & 1) == 0;
    }

    /**
     * 保证奇数与奇数、偶数与偶数的相对位置不变
     * 思路:类似冒泡算法,前偶后奇就交换
     *
     * @param array
     */
    public static void reOrderArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = array.length - 1; j > i; j--) {
                if (!isEven(array[j]) && isEven(array[j - 1])) {
                    int temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值