大致題意:
只借助一個輔助變量 i 用於遍歷數組,不再開闢另外的輔助空間,怎麼將一個數組倒置。
思路:
根據上述題意,因爲不能再使用多餘的輔助空間來協助數組倒置時元素的兩兩交換,因爲可以藉助 異或 的思想,來實現不用輔助變量而交換兩個數的值。核心如下:
前提: a != b && a、b 爲整數
a ^= b;
b ^= a;
a ^= b;
對於任意的 x 滿足:
x^x == 0;
x^0 == x;
那麼上面的式子事實上是利用瞭如上的規則,首先用a保存了a^b的 值,再用b = a ^ b = (a^b)^b=a^b^b=a^(b^b)=a^0=a
,這樣就成功的實現了b = a;接着又用a = a^b = (a^b)^b(第一個b還是原來的b,而第二個b已經是a的值,因爲前面已經實現了交換)= (a^b)^a = a^a^b = 0^b = b
,這樣就實現了a = b;於是,就成功的實現了a,b兩個值的交換。
當然,也有另外一種解法,那就是使用,這樣,就可以在一定程度上解除只能交換整數的限制,但是在交換浮點數時,可能會倒置誤差。
a = a + b;
b = a - b;
a = a - b;
具體實現:
public static void invert1(int[] arr) {
if (arr == null || arr.length == 0) return;
for (int i = 0; i <= arr.length / 2; i++) {
if (arr[i] != arr[arr.length - 1 - i]) {
arr[i] ^= arr[arr.length - 1 - i];
arr[arr.length - 1 - i] ^= arr[i];
arr[i] ^= arr[arr.length - 1 - i];
}
}
}
public static void invert2(int[] arr) {
if (arr == null || arr.length == 0) return;
for (int i = 0; i <= arr.length / 2; i++) {
if (arr[i] != arr[arr.length - 1 - i]) {
arr[i] = arr[i] + arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = arr[i] - arr[arr.length - 1 - i];
arr[i] = arr[i] - arr[arr.length - 1 - i];
}
}
}