新年派對上有 n 個禮物(n 為奇數),每個禮物有一個卡片號碼。只有一個號碼出現奇數次,其餘均出現偶數次。輸入多組測試數據,每組先給 n,再給 n 個正整數(< 2^31),輸出那個出現奇數次的號碼。n = 0 結束輸入。
x ^ x = 0(相同數異或為 0)x ^ 0 = x(任何數與 0 異或不變)因此,將所有號碼異或起來,成對出現的數字會抵消為 0,最終結果即為那個出現奇數次的數字。
O(n) 每測試用例,單次掃描。O(1),只需一個變量累積異或值。#include <cstdio>
int main() {
int n;
while (scanf("%d", &n) == 1 && n) {
int ans = 0, x;
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
ans ^= x;
}
printf("%d\n", ans);
}
return 0;
}
輸入:
5
1 1 3 2 2
3
1 2 1
0
輸出:
3
2
第一組:1^1^3^2^2 = 0^3^0 = 3;第二組:1^2^1 = 2。
n < 1,000,000),必須使用 scanf/printf 或關閉同步流,否則會 TLE。此技巧廣泛應用於「找出唯一出現一次/奇數次的元素」類問題,如 LeetCode 136「只出現一次的數字」、LeetCode 260「只出現一次的數字 III」(需結合位運算分組)。