1. 题目
调整数组顺序使得奇数位于偶数前面
1 2 3 4 5 => 1 3 5 2 4
题目意思很明确,就是将奇数调整到偶数前面,同时需要保证相对位置不变
2. 分析
现在要知道的是需要将所有的奇数移动到数组前面,则肯定是要和偶数交换,但是交换之后,此时相对位置如何保持?
仔细分析可以知道,我们可以使用双指针,这样的话,一旦交换之后,要保持位置,只需要将当前区间内的数都与最后面一个数依次交换,则可保持一个比较正确的顺序。
3. 代码
代码的话跟着上面的分析来的
/** * 利用双指针来操作 * 如果是奇数就跳过,偶数才开始双指针走 */ public void reOrderArray(int[] array) { int odd = 0; int even = 0; // 因为even一直向前,所以此时需要使用even作为边界 while (even < array.length) { // 奇数就直接跳过 if (array[even] % 2 != 0) { even++; odd++; continue; } // 只有偶数的时候才处理 while (even < array.length && array[even] % 2 == 0) { even++; } if (even >= array.length) break; // 到了第一个偶数位置 swap(array, odd++, even); // 然后交换之前到这一段区间的数字 swapRange(array, odd, even); } } /** * 交换区间,注意r保持不变,否则相对顺序不可保持 */ public void swapRange(int[] nums, int l, int r) { while (l < r) { swap(nums, l++, r); } } public void swap(int[] nums, int l, int r) { int temp = nums[l]; nums[l] = nums[r]; nums[r] = temp; }
4. 小结
本题思路很简单,主要就是双指针和相对位置的变换,只要明确了前进的规则以及交换的规则,写出来还是比较简单的。
Keep thinking, keep coding! In Nanjing!