输入一整数数组,调整数组中数字的顺序,使奇数位于数组的前半部分,偶数位于数组的后半部分
两个指针A, B. A指向开始 B指向结束。
向中间移动指针,当A指向偶数, B指向奇数时,交换位置。
当 A > B时,表示已经结束,得到移动后的数组
public static void reorder(int[] num) {
if (num == null || num.length < 2) {
return;
}
int left = 0;
int right = num.length - 1;
while (left < right) {
if ((num[left] & 1) == 0 && (num[right] & 1) == 1) { //左边偶数,右边奇数
swap(num, left++, right--);
} else if ((num[left] & 1) == 0) { //左边偶数, 右边偶数
right--;
} else if ((num[right] & 1) == 1) { //右边奇数,左边奇数
left++;
} else {
left++;
right--;
}
}
}
如果要求奇数偶数保持原来顺序, 可以用一个辅助数组,统计出奇数的数量k,遍历数组,奇数从0开始存入,偶数从k开始存储
public static void reorder(int[] num) {
if (num == null || num.length < 2) {
return;
}
int k = 0;
for (int val : num) {
if ((val&1) == 1)
k++;
}
int[] copy = num.clone();
int i = 0;
for (int val : copy) {
if ((val & 1) == 1) {
num[i++] = val;
} else {
num[k++] = val;
}
}
}