尋找特定數字問題
0x00 問題描述
給定一個整數陣列,除了一個元素出現 次( , ),其餘每個元素出現 ( )次,找到那個特殊的元素。
0x01 含有1bit數字的特殊情況
假設我們有一個只包含1bit
數字的陣列(只能是
或
),我們想計算陣列中
的數量,我們需要一個計數器count
。這樣每當數字
的數量count
達到某個值時,比如說
, count
返回
並重新開始。假設計數器具有二進位制形式的
位:
(從最高有效位到最低有效位)。我們可以得出以下四個性質:
- 計數器的初始狀態為零
- 對於陣列中的每個輸入,如果我們碰到 ,則計數器應保持不變
- 對於陣列中的每個輸入,如果我們碰到 ,則計數器應該增加
- 為了覆蓋 個計數,我們需要 ,這意味著 。
關鍵問題就在於:計數器中的每個位( )在掃描陣列時如何變化。為了滿足第二個性質,如果另一個運算元為 的話,我們使用哪些位運算會不改變運算元呢? 和 。
好的,我們現在有兩個可用的表示式: 或 ,其中 是輸入陣列中的元素。哪一個更好?我們還不知道,所以我們要實際操作一下。
開始時,計數器的所有位都初始化為零,即 ,保證計數器的所有位保持不變。如果我們碰到 ,計數器將為 ,直到我們碰到輸入陣列中的第一個 。在我們碰到第一個 之後,我們得到: 。讓我們繼續,直到我們碰到第二個 ,之後我們得到: ,注意 從 變為 。如果使用 的話,在第二次計數之後, 仍然是 ,所以很明顯我們應該使用 。 呢?以 為例,如果我們此時碰到 並需要更改 的值,那麼在我們進行更改之前, 的值必須是多少?答案是: 必須為 ,否則我們不應該更改 ,因為將 從 更改為 即可。因此,只有當 和 都是 時, 才會改變值,或者用數學公式表示為 。類似地,只有當