給定一個整數陣列,除了某個元素只出現一次外,其餘元素均出現三次。找出那個只出現一次的元素。
O(n)對於 32 位整數,統計陣列中所有數字在每個二進制位上 1 的總個數。因為出現三次的數字在每一位上的貢獻是 3 的倍數,所以每一位對 3 取模後的餘數,即為那個唯一數字在該位上的值。
具體步驟:
bits[32],初始化為 0。bits[i]。bits[i] 取模 3,得到的結果即為目標數字的二進制表示。int singleNumber(int* nums, int numsSize) {
int bits[32] = {0};
int res = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < numsSize; j++) {
bits[i] += (nums[j] >> i) & 1;
}
bits[i] %= 3;
res |= (bits[i] << i);
}
return res;
}
O(32 * n) = O(n),32 為常數。O(1),固定大小的 32 元素陣列。可用兩個變量 ones、twos 分別記錄「出現 1 次」和「出現 2 次」的位模式,利用位運算更新,最終 ones 即為答案。此法更優雅但理解難度較大,上述計數法更直觀易懂。
位元計數取模法將「出現三次」轉化為模 3 運算,巧妙利用二進制位獨立性,在線性時間、常數空間內解決問題,是處理「N 次 vs 1 次」類問題的通用模板。