面試題:搜索大於n/3個數的變量

感謝陳立人http://weibo.com/lirenchen?topnav=1&wvr=5&topsug=1的天天一道面試題的資料整理。關注「待字閨中」的微信,裏面有題目的分析。我會post他整理的題目,供你們一塊兒學習。 面試

原題

給定一批查詢日誌,數量爲n。其中,有的查詢出現多於n/3次,請在線性時間內,找到全部知足條件的查詢。 微信

分析

我我的第一反應就是對其排序,或者map函數進行計數。效率通常。 函數

之前的面試題,有一道是說查找多於出現一半的查詢,簡單的方法就是遇見到兩個,若是兩個不一樣,就同時刪掉這兩個。一直刪掉最後,剩下的就是知足條件的。 post

其能夠繼續擴展,有的查詢出現多於n/m次,找到知足條件的查詢。
學習

有一種很巧妙的方法,其想法的實現就是俄羅斯方塊。 spa

大致思路:

用一個map函數將查詢對應到一個值。 日誌

  • 查詢不在map函數裏面,添加新的map值,將其值設爲1。
  • 查詢在map函數裏面,追加其map後的值,將其值加1。
當map函數裏面映射的個數等於m時,就消除一行。

例如:遇到如下查詢序列:
4,4,2,3,1,3,2,3,5,4 
m=5,就是說那個map映射的個數等於5,填滿了一行,就消掉一行。
排序

先來了4,4,2,3這批查詢,分別填入map裏面。 ci






4



4 2 3

而後來了新一批查詢:1,3,2,3,5。

此時,來了5,map的映射個數已滿(爲5),因此能夠消掉一行。 get



3

4 2 3

4 2 3 1 5

這時就像俄羅斯方塊同樣,一行滿了,消失掉。此時map的映射就會變成這樣(減1),








3

4 2 3


最後,當刪除剩下的,就是知足條件的查詢。

這種方法十分高效,線性時間就能夠知足了。

相關文章
相關標籤/搜索