給出N個數字。其中僅有一個數字出現過一次,其餘數字均出現過兩次,找出這個出現且只出現過一次的數字。要求時間和空間複雜度最小。ios
輸入多個數字,每一個數字以空格分開。數字數量 N < 20,輸入數字的最大值小於 256.spa
輸出內容爲只出現過惟一一次的數字blog
10 10 11 12 12 11 16
16
解題思路:由於咱們事先已經知道了只有一個數出現一次其餘的全部的數字都是出現兩次,出現兩次咱們就能夠採用^異或運算符來消除(異或兩個相同的數會獲得0,和全0異或,結果不變;和全1異或,結果會獲得本身的取反。)
有公式:a^b^a^b=(a^a)^(b^b),因此咱們能夠知道10^10^11^12^12^11^16=16排序
時間複雜度爲O(n),空間複雜度爲O(1)ci
代碼以下:io
#include <iostream> using namespace std; int main() { int temp; int result = 0; while (cin >> temp) { result ^= temp; } cout << result << endl; return 0; }
此外,若是題目變爲只有一個數字出現奇數次,其餘的都出現偶數次也能夠這樣寫,」由於兩兩抵消」。class
另外,還有一些時間複雜度和空間複雜度比較高的解法有如:兩個循環遍歷(O(n^2)),用map容器等,也能夠是先排序後再進行操做,可是時間複雜度和時間複雜度都比用位操做符答。容器