奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

  • 可以使用两个队列,一个保存奇数,一个保存偶数,最后把数据重新放回数组
  • 时间复杂度O(n)
  • 空间复杂度O(n)
import java.util.*;
public class Solution {
    public void reOrderArray(int [] array) {
        int len = array.length;
        Deque<Integer> queue1 = new LinkedList<>();//奇数
        Deque<Integer> queue2 = new LinkedList<>();//偶数
        for(int i=0;i<len;i++){
            if((array[i] & 1) == 1){//奇数
                queue1.offer(array[i]);
            }else{
                queue2.offer(array[i]);                
            }
        }
        int i = 0;
        while(!queue1.isEmpty()){
            array[i++] = queue1.poll();
        }
        while(!queue2.isEmpty()){
            array[i++] = queue2.poll();
        }
    }
}

法二

不能保证奇偶原始顺序

class Solution {
    public int[] exchange(int[] nums) {
        int i = 0, j = nums.length - 1, tmp;
        while(i < j) {
            while(i < j && (nums[i] & 1) == 1) i++;
            while(i < j && (nums[j] & 1) == 0) j--;
            // tmp = nums[i];
            // nums[i] = nums[j];
            // nums[j] = tmp;
            swap(nums,i,j);
        }
        return nums;
    }

    public void swap(int[] nums,int i,int j) {
        if(nums[i] != nums[j]){
            nums[i] ^= nums[j];
            nums[j] ^= nums[i];
            nums[i] ^= nums[j];
        }
    }
}