NowCoder

题目描述

需要保证奇数和奇数,偶数和偶数之间的相对位置不变,这和书本不太一样。

解题思路

新建数组

方法一:创建一个新数组,时间复杂度 O(N),空间复杂度 O(N)。
【剑指Offer】21. 调整数组顺序使奇数位于偶数前面_数组

public class Solution {
    public void reOrderArray(int [] array) {
        int countji = 0;
        for(int i : array) {
            if(!iso(i))
                countji++;
        }
        int[] copy = array.clone();
        int i = 0, j = countji;
        for(int n : copy) {
            if(n % 2 == 1)
                array[i++] = n;
            else
                array[j++] = n;
        }
    }
    private boolean iso(int n) {
        return n % 2 == 0;
    }
}

冒泡 时间换空间

方法二:使用冒泡思想,每次都当前偶数上浮到当前最右边。时间复杂度 O(N2),空间复杂度 O(1),时间换空间。

public class Solution {
    public void reOrderArray(int [] array) {
        int len = array.length;
        for(int i = len-1; i > 0; i--) {
            for(int j = 0; j < i; j++) {
                if(iso(array[j]) && !iso(array[j+1])) 
                    swap(array, j, j+1);
            }
        }
    }
    // 判断偶数
    private boolean iso(int n) {
        return n%2 == 0;
    }
    // 交换
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}