異或
這個真的想不到,只能想到用額外空間的雜湊表或不用額外空間但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}、\ldots、a_{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 協議》,轉載必須註明作者和本文連結