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

2021-08-31 10:57:56 字數 1086 閱讀 8391

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

歡迎關注微博:

首先看看題目要求:

陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法找到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次的數字。

示範**如下:

// 【白話經典演算法系列之十七】

陣列中只出現一次的數

//  by morewindows( )

//  歡迎關注

#include

#include

intfindnumber

(int a, int n)

intmain

();  printf("%d\n", findnumber(a, maxn));  return

0;}

執行結果如下圖所示:

歡迎關注微博:

給我老師的人工智慧教程打call!

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

白話經典演算法系列之十七 陣列中只出現一次的數 歡迎關注微博 首先看看題目要求 陣列 a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字...

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

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

白話經典演算法系列

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