• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            coding everyday

            編程面試題 https://interview.codeplex.com

            C++博客 首頁 新隨筆 聯系 聚合 管理
              12 Posts :: 2 Stories :: 7 Comments :: 0 Trackbacks

            #

            本題目出自@陳利人

            問題:
            #Google面試題#給你一天的Google搜索日志,你怎么設計算法找出是否有一個搜索詞,它出現的頻率占所有搜索的一半以上?如果肯定有一個搜索詞占大多數,你能怎么提高你的算法找到它?再假定搜索日志就是內存中的一個數組,能否有O(1)空間,O(n)時間的算法?

            剛看到這個題目的時間嚇壞了,好難啊,無從下手啊,為自己的之上捉急啊。。下班的班車上開始想這個問題,開始分析,其實這個搜索日志就是一個搜索詞的集合嘛,甭管它有多大,總可以分成若干堆吧。既然這個搜索詞超過一半,那么在這若干堆中分別找出來最流行的詞中,也應該占一半吧。(這個應該沒有理解錯吧。)

            這個時候我想可以把問題轉換成一個整數數組,其中有個整數出現的次數超過一半,找出這個整數就OK了吧。要找出這個數組中出現次數超一半的值,本身這個算法應該很簡單,但是O(1)空間和O(n)的時間復雜度,還是有點傷腦筋的。。:(,內存又不貴,為啥O(1)啊。。

            因為那個數字出現的次數超過一半,我們可以想象一下,把那個數字標成1,其它的都是-1,把所有的數字加起來肯定大于0,對吧?因為超過一半嘛。。這個時候靈光乍現,用一個標桿來標志潛在的那個搜索詞,一個整數count表示它出現的次數(準確的說不是它的次數,后面會解釋),遍歷整個數組
            1)   如果當前的跟標桿一樣,count++
            2)   如果不相等,--count,若此時count為0,則把當前值置為標桿,count為1
            重復1), 2)即可,最后那個標桿即為最流行搜索詞。

            代碼簡單的我不能相信,以至于我覺得我肯定理解錯誤題目的意思了,不管怎么樣上下代碼 
             1 // Get the most popular searching keyword in Google. :)
             2 template<typename T>
             3 T get_most_popular_keyword(const T *list, int size) {
             4     T result = list[0];
             5     int count = 0;
             6 
             7     for (int i=0; i<size; i++) {
             8         if (list[i] == result)
             9             count++;
            10         else {
            11             if (--count == 0) {
            12                 count = 1;
            13                 result = list[i];
            14             }
            15         }
            16     }
            17 
            18     return result;
            19 }
            posted @ 2013-07-02 21:10 everyday 閱讀(363) | 評論 (0)編輯 收藏

            本文描述的是我自己的一個失敗的挑戰經歷。

            題目
            兩個單鏈表(singly linked list),每一個節點里面一個0-9的數字, 輸入就相當于兩個大數了。然后返回這兩個數的和(一個新list)。這兩個輸入的list 長度相等。 要求是:1. 不用遞歸。2. 要求算法在最好的情況下,只遍歷兩個list一次, 最差的情況下兩遍。

            我的算法是: 2次遍歷是肯定能的,第一次相加并以倒序存,第二次進位并倒序。一次/兩次的算法,用2個指針,一個指錢一個,另一個指向再前一個,另一個flag標志是否走第二輪。只有前前位有進位flag置true跑第二次。

            為啥當時會有這樣的想法呢?因為所有數字都是0~9,所以我假設了第一輪的相加和進位能把大部分該進位的都進了,所以如果存在需要第二輪的話,找出那個條件就好了。當時就沿著這個思路走了。當然大部分情況下這個算法是可行的,但是這里有個很明顯的漏洞,當時被勝利沖昏頭腦的我怎么會想的到呢?就是一開始沒有出現進位,后來連續進位的情況,如@趙小罡這位朋友設計的用例 1000001+9999999。一并感謝其他指出錯誤的網友。

            如果有人想懷著鄙視的心態看下我錯誤的代碼,請點擊“
            另外有個高手做了一個算法,總是只要一次就能搞定的。@hawstein詳情見“
            求兩個單鏈表的和” 尼害的不得了。他的網站上還有不少好東西呢。對于他的算法,我有個改進的建議就是,以他的算法完全沒有必要單獨考慮第一個節點的情況,在遍歷結束后,判斷下第一個節點是否大于9就OK了,如果大于9,最前面插入一個節點。
            posted @ 2013-07-02 09:51 everyday 閱讀(437) | 評論 (0)編輯 收藏

            僅列出標題
            共2頁: 1 2 
            女人香蕉久久**毛片精品| 欧美亚洲日本久久精品| 日日噜噜夜夜狠狠久久丁香五月| 久久久久久久久久久精品尤物| 久久九九兔免费精品6| 狠色狠色狠狠色综合久久| 亚洲一本综合久久| 婷婷久久综合九色综合绿巨人| 亚洲AV日韩AV天堂久久| 久久精品国产一区二区三区不卡| 久久乐国产综合亚洲精品| 国产 亚洲 欧美 另类 久久 | 91久久精品91久久性色| 久久精品成人| 久久se精品一区二区| 久久久精品国产免大香伊 | 久久亚洲国产精品123区| 久久精品国产亚洲AV高清热| 久久人搡人人玩人妻精品首页| 91精品国产综合久久久久久| 人妻无码αv中文字幕久久琪琪布| 情人伊人久久综合亚洲| 久久精品人人槡人妻人人玩AV| 亚洲国产成人精品无码久久久久久综合 | 久久精品成人欧美大片| 久久久久久免费一区二区三区| 欧美国产成人久久精品| 久久国产精品一区| 欧美亚洲国产精品久久蜜芽| 色婷婷综合久久久中文字幕 | 一本伊大人香蕉久久网手机| 久久夜色精品国产欧美乱| 精品久久久无码21p发布| 一97日本道伊人久久综合影院| 久久国产午夜精品一区二区三区| 久久综合九色综合精品| 久久99久久99小草精品免视看| 久久久久99精品成人片试看| 欧洲成人午夜精品无码区久久 | 久久人人爽人人爽人人片AV不 | 久久久久99精品成人片直播|