題目鏈接:
題目
經過一段時間的緊張籌備,電腦小組的“ 餐廳”終於開業了,這天,經理 接到了一個定餐大單,可把大家樂壞了!員工們齊心協力按要求準備好了套餐正準備派送時,突然碰到一個棘手的問題:筷子!
小朋友找出了餐廳中所有的筷子,但遺憾的是這些筷子長短不一,而我們都知道筷子需要長度一樣的才能組成一雙,更麻煩的是 找出來的這些筷子數量爲奇數,但是巧合的是,這些筷子中只有一隻筷子是落單的,其餘都成雙,善良的你,可以幫 找出這隻落單的筷子的長度嗎?
輸入
第一行是一個整數,表示筷子的數量 。
第二行有 個整數,第 個整數表示第 根筷子的長度 。
輸出
輸出一行一個整數表示答案。
樣例輸入
9
2 2 1 3 3 3 2 3 1
樣例輸出
2
數據範圍
對於 的數據,保證 。
對於 的數據,保證 ,。
提示
請注意數據讀入對程序效率造成的影響。
請注意本題的空間限制爲 。
思路
這道題要我們找出多出來的那個筷子的長度,但是題目的空間限制是,那麼也就是說,我們不能開那麼大的數組。
那怎麼辦呢?
我們就可以用一個叫做異或的東西來解決。異或就是把兩個數在二進制中相同的地方變成,不同的地方變成,其實就是找出兩個數的不同之處。
那麼也就是說,如果兩個數相同,那麼它們異或的結果就是。
又因爲配對的筷子長度一樣,那我們直接把所有筷子的長度異或在一起,就可以得出多出來的那個筷子的長度了。
代碼
#include<cstdio>
#define rr register
using namespace std;
int n, ans, x;
int read() {//快讀
int re = 0;
char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9') {
re = re * 10 + c - 48;
c = getchar();
}
return re;
}
int main() {
n = read();//讀入
for (rr int i = 1; i <= n; i++) {
x = read();//讀入
ans ^= x;//異或
}
printf("%d", ans);//輸出
return 0;
}