分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
歡迎關注微博:
首先看看題目要求:
陣列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 每個結點的左子樹和右子樹都...