这个题牛客上和书上不太一样;书上没有要求奇数和偶数的相对位置不变,而是考的对于代码的解耦;
其中思路一和思路二可以保证位置不改变
思路三适合于位置改变的;
思路一:使用冒泡排序。时间复杂度O(n^2),O(1);每次有偶数都放在最后一位;
public void reOrderArray(int [] array) {
int length = array.length;
for (int i = length- 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if ((array[j]%2==0) && (array[j + 1]%2!=0)) {
int t = array[j];
array[j] = array[j+1];
array[j+1] = t;
}
}
}
}
思路二:创建新的数组,空间换时间。O(n),O(n);
public void reOrderArray(int [] array) {
// 奇数个数
int oddCount = 0;
for (int x : array)
if (x%2!=0)
oddCount ++;
int[] copy = array.clone();
int i = 0, j = oddCnt;
for (int num : copy) {
if (num % 2 == 1)
array[i++] = num;
else
array[j++] = num;
}
}
思路三:使用快速排序思想,设置两个指针begin,end;
当begin为奇数时,begin++;
当end为偶数时,end--;
否则交换begin和end;begin++,end++;
直到begin>=end;