給定整數陣列,要求在 O(n) 時間、O(1) 空間 內完成重排,使所有奇數位於偶數之前。
begin 從頭向後掃描,遇到偶數停下end 從尾向前掃描,遇到奇數停下begin < end,交換兩元素,繼續掃描public class ArrayReorder {
public static void reorderOddEven(int[] arr) {
int begin = 0, end = arr.length - 1;
while (begin < end) {
// 向右找偶數
while (begin < end && (arr[begin] & 1) != 0) begin++;
// 向左找奇數
while (begin < end && (arr[end] & 1) == 0) end--;
if (begin < end) {
int tmp = arr[begin];
arr[begin] = arr[end];
arr[end] = tmp;
}
}
}
public static void main(String[] args) {
int[] data = {1, 2, 3, 4, 5, 7, 9, 11};
System.out.println("Before: " + Arrays.toString(data));
reorderOddEven(data);
System.out.println("After: " + Arrays.toString(data));
}
}
(x & 1) != 0 位運算判斷奇數,比取模更高效while 保證指針不越界且精準定位待交換元素同樣模板可解決:
Before: [1, 2, 3, 4, 5, 7, 9, 11] After: [11, 9, 7, 5, 3, 1, 4, 2] // 奇數全在前,偶數全在後,順序不保證