初級演算法

okumiko發表於2020-12-15

異或

這個真的想不到,只能想到用額外空間的雜湊表或不用額外空間但O(n)的排序

  • 異或運算有以下三個性質。

1.任何數和 0 做異或運算,結果仍然是原來的數,即 a \oplus 0=a
2.任何數和其自身做異或運算,結果是 0,即 a \oplus a=0
3.異或運算滿足交換律和結合律,即 a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b

假設陣列中有 2m+1 個數,其中有 m 個數各出現兩次,一個數出現一次。令 a_{1}a_{2}\ldotsa_{m}為出現兩次的 m 個數,a_{m+1}為出現一次的數。根據性質 3,陣列中的全部元素的異或運算結果總是可以寫成如下形式:

(a_{1} \oplus a_{1}) \oplus (a_{2} \oplus a_{2}) \oplus \cdots \oplus (a_{m} \oplus a_{m}) \oplus a_{m+1}

根據性質 2 和性質 1,上式可化簡和計算得到如下結果:

0 \oplus 0 \oplus \cdots \oplus 0 \oplus a_{m+1}=a_{m+1}

因此,陣列中的全部元素的異或運算結果即為陣列中只出現一次的數字。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e: nums) ret ^= e;
        return ret;
    }
};
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章