描述
給出n個數字。其中僅有乙個數字出現過一次,其他數字均出現過兩次,找出這個出現且只出現過一次的數字。要求時間和空間複雜度最小。
輸入輸入多個數字,每個數字以空格分開。數字數量 n < 20,輸入數字的最大值小於 256.
輸出輸出內容為只出現過唯一一次的數字
輸入樣例
10 10 11 12 12 11 16
輸出樣例
16有公式:a^b^a^b=(a^a)^(b^b),所以我們可以知道10^10^11^12^12^11^16=16解題思路:因為我們事先已經知道了只有乙個數出現一次其他的所有的數字都是出現兩次,出現兩次我們就可以採用^異或運算子來消除(異或兩個相同的數會得到0,和全0異或,結果不變;和全1異或,結果會得到自己的取反。)
時間複雜度為o(n),空間複雜度為o(1)
**如下:
#include using namespace std;int main()
cout << result << endl;
return 0;
}
此外,如果題目變為只有乙個數字出現奇數次,其他的都出現偶數次也可以這樣寫,」因為兩兩抵消」。
另外,還有一些時間複雜度和空間複雜度比較高的解法有如:兩個迴圈遍歷(o(n^2)),用map容器等,也可以是先排序後再進行操作,但是時間複雜度和時間複雜度都比用位操作符答。
Python每日一練0001
我們有乙個包含n個元素的元組或序列,現在想把它分解為n個單獨的變數。例如我們有乙個序列 1,2,3 想把1,2,3分別賦值給a,b,c三個變數。只需要簡單的賦值就可以了,唯一的要求是變數的數量和序列的數量必須要一致 例如 l foo 5,bar a,b,c l print a,b,c foo 5 b...
找出單獨出現的數字
給出n個數字。其中僅有乙個數字出現過一次,其他數字均出現過兩次,找出這個出現且只出現過一次的數字。要求時間和空間複雜度最小。一開始是很普通的想法,從第乙個數開始,從前往後遍歷。但兩個數相同時,將兩數賦乙個不可能出現的值。再重新遍歷陣列,找出沒有被賦予不可能出現值的值。private static s...
每日一題之找出兩個單獨出現的數字
題目 讀入2n個數字,其中,除了有兩個數字是單獨出現外,剩下任何乙個數字出現次數都是偶數個,請寫出演算法找出這兩個數字並輸出 讀入樣例 81 3 4 5 9 1 4 3 輸出 5 9 思路1 看到這道題目,第一反應就是for迴圈列舉一遍,然後統計每個數字出現的次數,最後輸出出現次數是奇數次的 map...