题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解析:题目的意思也很明确,就是将奇数放在前面,偶数放在后面,但是相对顺序不能发生改变。

这道题最好画图看变化,一下就可以看出规律了。规律就是可以使用双指针,一个偶数指针,一个奇数指针,偶数指针一直前进,遇到奇数则与奇数指针交换,然后由于奇数指针的位置是上一次偶数指针的位置,此时表示乱序了然后循环交换即可。当时我第一次交换是前一个和后一个交换,后面发现如果中间元素超过2个,不能够复原顺序,所以只能采用每一个都和最后一个交换,这样的话一定能够顺序。

代码如下:我加了注释,跟着画画图绝对能出的

public void reOrderArray(int[] array) {
        if (array.length <= 1) return;
        // 首先定义两个指针
        int odd = 0;// 奇数
        int even = 0;// 偶数
        while (even < array.length) {
            if (array[even] % 2 == 0) {
                // 如果是偶数的话,留奇数指针在原位置,偶数指针前进
                even += 1;
                // 只要符合边界条件且是偶数一直向后查找,只为找到奇数
                while (even < array.length && array[even] % 2 == 0) {
                    even++;
                }
                // 否则就是遇到了奇数
                if (even < array.length) {
                    reOrderSwap(array, odd, even);
                    // 交换之后,由于偶数乱序了,此时需要交换使得位置变为正确的,此时odd位已经交换了
                    odd ++;// 此时奇数向后走一位
                    int temp = odd;// 采用一个临时变量,否则odd会移动,则奇数的结尾就乱了
                    while (temp + 1 <= even) {
                        // 这里主要是防止 4 6 2  => 2 4 6,如果单纯的只跟后面一个数交换会变成6 2 4结果还是错的
                        reOrderSwap(array, temp, even);
                        temp++;
                    }
                }
                // 如果这里没遇到,表明后面都是偶数,则会结束
            }else{
                // 否则第一个就是奇数,奇偶一起走
                odd++;
                even++;
            }
        }
    }

    public void reOrderSwap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

Keep thinking, keep coding~
2020-7-15 20:44:22