給定整數陣列,除一個元素出現一次外,其餘均出現兩次。找出那個只出現一次的元素。要求線性時間、常數額外空間。
性質:a ⊕ a = 0,a ⊕ 0 = a,滿足交換律與結合律。將所有元素異或,成對元素抵消為 0,剩下的即為單獨元素。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int x : nums) ans ^= x;
return ans;
}
};
用 unordered_map 統計頻率,遍歷找頻率為 1 的鍵。可擴展到「出現三次找一次」等變體。
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> cnt;
for (int x : nums) ++cnt[x];
for (auto &p : cnt) if (p.second == 1) return p.first;
return 0;
}
};
Single Number II(三次/一次)需用位運算狀態機;Single Number III(兩個單獨)用異或分組。