题解 | #调整数组顺序使奇数位于偶数前面#【交换法】
调整数组顺序使奇数位于偶数前面
http://www.nowcoder.com/practice/ef1f53ef31ca408cada5093c8780f44b
思路
我的思路是通过前移部分需要移动的奇数元素,来使得数组中的奇数在数组中的前部分,偶数在后部分,通过遍历数组,如果当前元素为奇数,那么我们需要将它前移到它的前一个数不再是偶数为止,对数组中所有奇数都这样做,最终偶数的顺序也会自然排好。
实现
public class JZ13调整数组顺序使奇数位于偶数前面 { public int[] reOrderArray(int[] array) { if (array == null) { return null; } int[] tmp = new int[array.length]; System.arraycopy(array, 0, tmp, 0, tmp.length); for (int i = 1; i < tmp.length; i++) { if (isOdd(tmp[i])) { //当前为奇数 int j = i; //记录下当前下标 while (j >= 1 && !(isOdd(tmp[j - 1]))) { //若前一个数为偶数,则一直前移到前一个数为奇数为止 swap(tmp, j - 1, j); j--; } } } return tmp; } /** * 交换数组中的两个元素的位置 * * @param array * @param i * @param j */ public void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } /** * 是否为奇数 * * @param x * @return */ public boolean isOdd(int x) { if (x % 2 != 0) { return true; } return false; } }
之所以运行时间偏低是因为我在之后复盘其他人的题解时,发现他们基本都是用的两数组拼接的方法做的,即遍历一遍数组,奇数元素添加到预创建的一个奇数数组中(或是链表),偶数则同理,最终将奇偶两个数组或链表拼接起来返回,虽然他们这种方法很快,用空间换取了时间,但我认为这种方法锻炼不到思维,没什么意思,因此我更偏向于用我这种交换法去做,当然这只是站在平时锻炼编码能力的角度出发的。