給定整數數組,除一個數字出現 1 次外,其餘均出現 3 次。要求線性時間、常數額外空間找出該唯一數字。例如 {1, 2, 1, 2, 1, 2, 7} 輸出 7。
利用二進制位獨立性:對每一位(共 32 位),統計所有數字該位上 1 的總個數。因其餘數字出現 3 次,其每位 1 的貢獻為 3 的倍數。唯一數字的該位值 = 總個數 % 3。將 32 位結果按權重組合即得答案。
#include <stdio.h>
#include <math.h>
int main() {
int a[] = {1, 2, 3, 1, 2, 1, 3, 2, 7, 3};
int n = 10;
int res = 0, i, j, m;
for (i = 0; i < 32; i++) { // 遍歷 32 位
m = 0;
for (j = 0; j < n; j++) {
if (a[j] % 2 == 1) m++; // 統計最低位 1 的個數
a[j] = a[j] >> 1; // 右移一位,下輪檢查高位
}
res += (m % 3) * pow(2, i); // 該位結果乘權重累加
}
printf("%d", res); // 輸出 7
return 0;
}
a[j] >>= 1 依次檢查每一位,無需額外空間,滿足 O(1) 空間限制m % 3 改為 m % k此解法完美符合題目「線性時間、無額外空間」的嚴格要求,展現位運算在算法設計中的強大威力。