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

2021-06-28 12:55:34 字數 1235 閱讀 9907

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

歡迎關注微博:

首先看看題目要求: 陣列

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;  

}  

執行結果如下圖所示:

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!歡迎關注微博 首先看看題目要求 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法找到x。應該如何思考了?前兩篇文章是利用兩個相同的數異或結果為0來計算的,但這個題目中其他數字是出現了3次,因此肯定不可以再使用異...

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!歡迎關注微博 首先看看題目要求 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法找到x。應該如何思考了?前兩篇文章是利用兩個相同的數異或結果為0來計算的,但這個題目中其他數字是出現了3次,因此肯定不可以再使用異...

白話經典演算法系列

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆的定義二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都...