《剑指Offer》题目:调整数组顺序使奇数位于偶数前面
题目描述:调整数组顺序使奇数位于偶数前
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目分析:
题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变。
Java代码:
public class ReOrderArray { //这种方法不能保证奇数和奇数,偶数和偶数之间的相对位置不变 public static void reOrderArray(int [] array) { if (array.length == 0 || array.length == 1) return; int p1 = 0; int p2 = array.length-1; int temp = 0; while (p1 < p2){ if (array[p1] %2 == 0){ if (array[p2] % 2 == 0) p2--; else { temp = array[p2]; array[p2] = array [p1]; array[p1] = temp; p1++; p2--; } }else { p1++; } } } //这种方法可以保证奇数和奇数,偶数和偶数之间的相对位置不变 public static void reOrderArray1(int [] array){ if (array.length == 0 || array.length == 1) return; int p1 = 0; int p2 = 1; int temp = 0; while ( p2 < array.length){ //如果p1已经指向了偶数,这时开始向后移动p2,直到p2指向奇数,然后开始交换 if (array[p1] % 2 == 0){ if (array[p2] % 2 == 0){ p2++; }else { //为保证相对位置不变,采用移位 temp = array[p2]; for (int i = p2; i > p1; --i){ array[i] = array[i-1]; } array[p1] = temp; } } //如果p1指向的元素为奇数,p1向后移直到指向偶数,此时p2始终位于p1后面一位 else { p1++; p2 = p1+1; continue; } } } public static void main(String[] args){ int [] arr = new int[]{1,-3,4,-6,8,-9,7}; reOrderArray1(arr); for (int i=0; i<arr.length; ++i){ System.out.print(arr[i]+ " "); } } }
技进乎艺,艺进乎道