21. 调整数组顺序使奇数位于偶数前面

NowCoder

题目描述

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

21. 调整数组顺序使奇数位于偶数前面 - 图1

解题思路

方法一:创建一个新数组,时间复杂度 O(N),空间复杂度 O(N)。

  1. public void reOrderArray(int[] nums) {
  2. // 奇数个数
  3. int oddCnt = 0;
  4. for (int x : nums)
  5. if (!isEven(x))
  6. oddCnt++;
  7. int[] copy = nums.clone();
  8. int i = 0, j = oddCnt;
  9. for (int num : copy) {
  10. if (num % 2 == 1)
  11. nums[i++] = num;
  12. else
  13. nums[j++] = num;
  14. }
  15. }
  16. private boolean isEven(int x) {
  17. return x % 2 == 0;
  18. }

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

  1. public void reOrderArray(int[] nums) {
  2. int N = nums.length;
  3. for (int i = N - 1; i > 0; i--) {
  4. for (int j = 0; j < i; j++) {
  5. if (isEven(nums[j]) && !isEven(nums[j + 1])) {
  6. swap(nums, j, j + 1);
  7. }
  8. }
  9. }
  10. }
  11. private boolean isEven(int x) {
  12. return x % 2 == 0;
  13. }
  14. private void swap(int[] nums, int i, int j) {
  15. int t = nums[i];
  16. nums[i] = nums[j];
  17. nums[j] = t;
  18. }

21. 调整数组顺序使奇数位于偶数前面 - 图2