题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
分析
注意题中要求“相对位置不变”,即保持稳定性。
方法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; } } } } }