陣列中只出現一次的數

2021-07-03 18:35:40 字數 1199 閱讀 7237

首先看看題目要求: 陣列

a中,除了某乙個數字

x之外,其他數字都出現了三次,而

x出現了一次。請給出最快的方法找到x。

這個題目非常有意思,在本人部落格中有《

位操作基礎篇之位操作全面總結

》這篇文章介紹了使用位操作的異或來解決——陣列中其他數字出現二次,而x出現一次,找出x。有《

》這邊文章介紹了分組異或的方法來解決——陣列中其他數字出現二次,而x和y出現一次,找出x和y。而這個題目則是其他數字出現3次,x出現一次。

應該如何思考了?

前兩篇文章是利用兩個相同的數異或結果為0來計算的,但這個題目中其他數字是出現了3次,因此肯定不可以再使用異或了。

我們換乙個角度來看,如果陣列中沒有x,那麼陣列中所有的數字都出現了3次,在二進位製上,每位上1的個數肯定也能被3整除。如從二進位製上看有:

1:0001

5:0101

1:0001

5:0101

1:0001

5:0101

二進位制第0位上有6個1,第2位上有3個1.第1位和第3位上都是0個1,每一位上的統計結果都可以被3整除。而再對該陣列新增任何乙個數,如果這個數在二進位制的某位上為

1都將導致該位上

1的個數不能被

3整除。因此通過統計二進位製上每位1的個數就可以推斷出x在該位置上是0還是1了,這樣就能計算出x了。

推廣一下,所有其他數字出現n(n>=2)次,而乙個數字出現1次都可以用這種解法來推導出這個出現1次的數字。

示範**如下:

[cpp]view plain

copy

// 【白話經典演算法系列之十七】陣列中只出現一次的數

//  by morewindows(  ) 

//  歡迎關注

#include 

#include 

intfindnumber(

inta, 

intn)  

intmain()  

;  printf("%d\n"

, findnumber(a, maxn));  

return

0;  

}  

執行結果如下圖所示:

本文**:

陣列中只出現一次的數

題目1 乙個陣列中,除了某乙個只出現過一次的數字外,其餘數字均出現過2次,找出這個只出現了一次的數字。思路 分析題幹,發現強調了陣列中數字出現的次數為1和2,則可以想到異或運算,兩個相同的數字異或結果為0,相同的數異或的結果為其本身,且異或運算存在交換律和結合律,即a b a b,b a a b。那...

陣列中只出現一次的數

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。思路 首先 位運算中異或的性質 兩個相同數字異或 0,乙個數和0異或還是它本身。當只有乙個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。依照這個思路...

陣列中只出現一次的數

問題一 在乙個整數陣列中,除了乙個數之外,其他的數出現的次數都是兩次,求出現一次的數,要求時間複雜度盡可能的小。例如陣列,出現一次的數是1.從題目的描述可以看出,陣列中只有乙個數字出現了一次,其他的數字都出現兩次,聯想到異或運算的特點 任何乙個數字和自己做異或運算的結果都是0,任何數字和0運算的結果...