騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

沙拉嘿呦~發表於2018-12-20

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法
春節期間小明使用微信收到很多個紅包,非常開心。在檢視領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體演算法思路和程式碼實現,要求演算法儘可能高效。

給定一個紅包的金額陣列gifts及它的大小n,請返回所求紅包的金額。若沒有金額超過總數的一半,返回0。

測試樣例:

[1,2,3,2,2],5

返回:

2

思路;考慮到題目要求演算法儘可能高效,所以放棄使用hashtable計數比較來做

使用相同則增一計數,相異則減一計數,設序列首部值為key,count = 1

然後從序列第二個值開始迴圈,每次迴圈元素與key比較,如果相同,則count++

不同則,count–,直到count變為-1,則考慮此時的元素為key,繼續從當前位置迴圈直到序列結束

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

這篇文章看到這裡小編給大家分享一個java大牛的微信:dongnaobest20,歡迎大家一起來交流學習,我們們不看技術怎麼樣,小編都歡迎,不定期分享乾貨,包括我自己整理的一份2018最新JAVA資料。

例子如下:

例如 4 4 2 3 4

文字 - 首先,key = 4 ,count = 1,第二個4與key相同,count增加1,變為2

然後2 3分別與key不同,count減去2,變為0

最後4與key相同,count++,變為1

輸出結果是4

這樣看起來好像沒什麼問題,但是如果出現以下情況呢?

例如 4 4 4 3 3 2 2 1 1

首先key = 4 ,count為1,經過另外兩個4,key還是4,count變為3

經過 3 3 2 ,key為4,count為0

接著經過2 ,key為4,count為-1,此時考慮變換key為2,count為1

接著經過1,key為2,count為0

接著經過1,key為2,count為-1,此時考慮變換key為1,count為1

所以結果是1

但是這個序列裡1明顯不是超過一半的

這是為什麼呢?因為在這有點像 鷸蚌相爭漁翁得利,4 3 2分別爭寵,最後1收了漁網~

那怎麼避免呢?

在第一次迴圈後將最後的key再次帶入第二次迴圈,和序列元素比較

為了區別count,使用flag作為計數器,初始化為1

當遍歷序列時,相同則flag++,不同則flag–

當序列比較結束,看flag是否大於等於1,如果是,則超過一半,輸出key

如果不是,輸出None

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

程式碼實現如下:

(gifts用list相關名稱表示)

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

多個測試資料:

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

注意list_4 呼叫函式返回值0,即找不到超過一半數量的數字~

最後附上大牛二維碼領取全套java資料噢~

騰訊招聘Python程式設計師面試題目:Python資料結構與演算法

相關文章