剑指13.调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

分析

注意题中要求“相对位置不变”,即保持稳定性。

方法1:最简单的思路是开辟额外数组,遍历一次数组,遇到奇数直接放入新开的数组中,再遍历一次数组,遇到偶数就继续放入新开的数组,最后再进行一次数组copy。

方法2:类似于插排的思想,遇到奇数就从往前找偶数,如果找到就两两交换位置,遇到奇数就跳出循环。

方法1

public class Solution {
    //使用辅助数组
    public void reOrderArray(int [] array) {
        int[] newArr = new int[array.length];
        int i = 0;
        for (int num : array){
            if ((num & 1) == 1){ //奇数
                newArr[i++] = num;
            }
        }
        for (int num :array){
            if ((num & 1) == 0){ //偶数
                newArr[i++] = num;
            }
        }
        for (int j = 0; j < newArr.length; j++){
            array[j] = newArr[j];
        }
    }
}

方法2

public class Solution {
    public void reOrderArray(int [] array) {
        for (int i = 1; i < array.length; i++){ //从第二个数开始找
            if ((array[i] & 1) == 1){ //当前这个数是奇数
                for (int j = i - 1; j >= 0; j--){
                    if ((array[j] & 1) == 1)
                        break;
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }
}
 
原文地址:https://www.cnblogs.com/HuangYJ/p/13457961.html