解法一、
直观的处理逻辑,开辟一个结果数组,第一趟遍历原数组,将原数组中的奇数依次挪到结果数组中;第二趟再遍历一遍原数组,将原数组中的偶数再依次挪到结果数组中。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
import java.util.*;
public class Solution {
public int[] reOrderArray (int[] a) {
if (a == null)
return null;
int[] ret = new int[a.length];
int i = 0;
for (int j = 0; j < a.length; j++) { // 第一趟,依次移动奇数
if (a[j] % 2 != 0) {
ret[i++] = a[j];
}
}
for (int j = 0; j < a.length; j++) { // 第二趟,依次移动偶数
if (a[j] % 2 == 0) {
ret[i++] = a[j];
}
}
return ret;
}
} 解法二、插入排序思想
使用插入排序的思想,就地处理,不用开辟新的空间,但是没找到一个奇数都要向前判断这个奇数应该插入的位置,因此时间复杂度上并不经济,但是可以加深对于插入排序的理解。
特点:
- 就地变动
- 每个奇数一次跟前一个数进行比较,如果前面一个是偶数,就跟他交换,一直交换到队首或前面是奇数。
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
import java.util.*;
public class Solution {
public int[] reOrderArray (int[] a) {
if (a == null)
return null;
int j, tmp;
for (int p = 1; p < a.length; p++) { // 插入排序的思想
tmp = a[p];
for (j = p; j > 0 && isOdd(tmp) && isEven(a[j-1]); j--) {
a[j] = a[j-1];
}
a[j] = tmp;
}
return a;
}
private boolean isOdd(int x) {
return (x & 0B1) != 0; // 奇数
}
private boolean isEven(int x) {
return (x & 0B1) == 0; // 偶数
}
} 
京公网安备 11010502036488号