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!