【算法】倒置數組——元素交換時不借助臨時變量

大致題意:

只借助一個輔助變量 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];
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章