[轉]面試算法小記

轉載一】 時間受限

大部分的面試題,都是對時間複雜度有所要求的,如果有涉及,“最快”一類的字樣,毫無疑問,先上時空原理,用空間來換時間。Hash,大數組,一些輔助性的空間,都是首選。在我的面試經歷中,有無數次用到過Hash和大數組的。不過,通常這不會是面試官想聽的唯一解法,他們緊接着十有八九是會說“如果只有xxxx空間呢?”。說此類方法只是爲自己爭取更多的時間,並且體現思考的完整性,簡而言之,裝B用。。。 eg1.1:求一個char(8bit)中,二進制1的個數,越快越好。 -- 《編程之美》 eg1.2:有一個整數數組A[N],讓你不用除法,求另一個數組B[N],其中B[i] = A[0]*A[1] ... * A[N-1] / A[i],期望複雜度是O(N)。 -- TopLanguage

 

【二】 空間受限

這裏的空間受限,指的是在大數據分析的邏輯下,空間受限的問題。大部分情況下,就是壓縮。位圖是一個很好的方法,用一個bit(或幾個)取代更大的int類型,最常見的位圖是1bit 取代 1int,其實,很多時候,1bit可以取代更大的空間,這完全取決於你需要保留的信息。。。 eg2.1:有一個很大的文件,存放一堆7位的電話號碼,號碼無重複,請用最小的內存消耗,將其排序。 -- 《編程珠璣》 eg2.2:給10MB的內存,給一個4百萬整數的文件,找一個不在文件中的整數。 -- (傳說中的Google面試題)

 

【三】 基於文件

越來越多的大公司,開始關係對文件的處理,上面所說的空間受限的問題,其實也基本都是和文件打交道。基於文件的處理,基本都是尋找,或者排序,最最核心的,就是減少文件讀取的次數。除了位圖法,還可以考慮哨兵,典型的案例就是外排中,增加單個文件大小的方法。 eg3.1:給定一個包含4300000000個32位整數的順序文件,找到一個至少出現兩次的整數。 -- (傳說中的微軟面試題,我曾經遇到過類似的)

http://hi.baidu.com/diwayou/blog/category/%B1%E0%B3%CC%D6%E9%E7%E1

eg3.2:有一個文件,有很多很多的整數(也許有100億),尋找其中最大的K個。 -- 《編程之美》

 

【四】 常見方法

你需要相信,面試官也是人,他不會有心情花30分鐘給你描述一個問題,或者讓你做50頁紙的推導,考算法的目的只是爲了你的思維能力,而不是真的想讓你搞定一個複雜的問題。大部分問題,都是有比較快速清晰的解決方法的。。。

1. 分治法 這絕對是你必須考慮使用的一種方法,如果有可能的話。動態規劃這東西,在面試的時候比較沉重,不好描述,不好書寫,而分治卻剛剛好,美麗,快捷,易書寫,是面試官殺人越貨的首選武器。分治的用法實在是太多了,幾乎是無所不在,二分,快排,種羣計數,各個唯美無比。。。

eg4.1:給你一個長度爲N的整數數組,請找出最大的子數組和。 -- 《編程之美》

eg4.2:求一個int(32bit)中,二進制1的個數。 -- 《代碼之美》(注,不是編程之美是另一本書,有一章叫做種羣計數,這是一種很酷的分治)

2. 排序和查找 排序出現的次數實在是太多了,很重要的一點,排序的東西才能用二分。二分是如此好用,以至於我們總是想着排序。查找和排序總是緊密聯繫的,當然,僅僅是爲了查找,做一次排序,你需要衡量一下代價。。。

eg4.3:有一個論壇,有ID發帖數目超過總數的一半,給你論壇所有帖子的ID列表,請你找到這個水王。 - -《編程之美》

eg4.4:給一組一維的空間 [1, 6] [2, 4] ... ,請求是否有區間重疊。 -- 《編程之美》

3. 減小問題規模 很多時候,題目看上去很嚇人,仔細分析一下,就可以刨去其中大部分的無關內容,獲得真正的出題意圖,這一點很重要。另外有些時候,題目會在空間上做出一些限制,這個時候,你可以考慮動態的對數據規模進行縮減,比如用減法或除法抵消,用抑或抵消,等等。。。

eg4.5:給一個整數N,求它的階乘N!,有幾個0結尾。 -- 《編程之美》

eg4.6:盒子裏有三種顏色的球,紅黃藍,可以用任意兩個不同顏色的球,換兩個另外顏色的球,比如1紅 + 1黃 = 2藍。現在盒子裏面有171個紅球,172個黃球,173個藍球,問,能不能經過若干次交換,最終變成同一顏色的球。 -- TopLanguage

eg4.7:同eg4.3

eg4.8:有一組數,除了一個數只有1個,其他都是兩兩成對的,請找出那一個不成對的數。另,如果不成對的數有兩個,該如何是好。 -- TopLanguage

4. 常量法 典型的速餐方法,它的思想是,一組數,在某些情況下,和一定,通過這個常量,進行反推,可快速搞定一些問題。。。

eg4.9:有一副撲克牌(你可以用任意方式來表示),被抽去一張,請快速找出這抽去的一張是什麼? -- 微軟面試題,活生生

5. 編碼 編碼真是個好東西,它可以將複雜的問題抽象化。比如,對一個序列進行編碼,可以直接映射到數組腳標上,大大提高訪問速度。。。

eg4.10:最近一次百度筆試題

eg4.11:有1000瓶超級名貴的葡萄酒,其中有1瓶有毒。這種毒藥很厲害,哪怕被稀釋了1000000倍還是可以毒死人的。但這個毒藥一定時間後纔會毒發,時長是1個月。爲了不浪費這些葡萄酒,有1000個壯士決定花5周的時間將毒酒找出,他們只希望最多有10個人犧牲,你需要如何安排才能實現。 -- TopLanguage 6. 概率 不要輕視概率題,哪怕是最基本的概率常識。概率題之所以被青睞,因爲它們往往違背直覺,容易讓人陷入迷茫,這種場面是面試官喜聞樂見的。我曾經在baidu面試中,被一道簡單的概率題,調戲的臉面全無,至今想起,仍然是汗流滿面。所以,爲了人身安全,複習一下概率的基本知識吧。。。

eg4.12:有一個長度爲N的鏈表,N未知。希望你只遍歷一次鏈表,就從鏈表中等概率的挑出K個數。 -- TopLanguage

 

【五】 加速方法

很多時候,你給的算法基本正確,但是還不夠優秀。面試官會希望你優化一下。優化的方法有很多,就基本的思路就是,考慮一下到底哪裏出現了浪費。常見的浪費有兩種,一種是用了比較沉重的運算,比如除法、取模等,你可能需要爲計算來加速。另外有時候,你的算法還太粗線條,比如只需要符號,你卻計算了總數等等。。。

eg5.1:求兩個數的最大公約數。 -- 《編程之美》

eg5.2:有一個整數數組A[N],求其中連續N-1個數的最大乘積。 -- 《編程之美》

eg5.3:估計一下快速排序的比較次數。 -- 《代碼之美》

 

【六】 數據結構

大部分面試時候,我們都是面向數組來設計算法,因爲簡單變化多,面試官好把握。但其他數據結果,同樣也很重要。AVL,B樹那樣的可能比較複雜,但是鏈表、樹這樣的結構,也經常出沒,我個人就碰見多次。。。

1. 鏈表

eg6.1:給你一個單鏈表的頭指針,在不使用大量附加數據或修改原有數據的前提下,檢查一個單鏈表是否有環。 -- 微軟面試題,活生生

eg6.2:給你兩個鏈表,如何判斷其是否相交,如果相交,如何找到兩個鏈表的第一個交點。 -- 《編程之美》

eg6.3:只給你一個指向鏈表中某元素的指針,請刪除該元素。 -- 《編程之美》

2. 樹

eg6.4:寫堆排序的算法

eg6.5:判斷一棵二叉樹T中,是否包含另一顆二叉樹P的結構。 -- 微軟面試題,活生生

 

以上一些內容,只是管中窺豹而已,一不小心,還被我寫成了題集。原先只是給我自己做個索引的,所以沒有加任何求解的內容,如果有興趣,可以查看相關出處。題目來源主要是一些快餐式的書和論壇,包括《編程之美》《代碼之美》《編程珠璣》,其中特別推薦,TopLanguage Group的“今天我們思考”專輯。快餐吃多了總會不營養的,需要慢條斯理的按食譜吃點營養大餐才能真正的強身健體,比如高大爺的聖經,《算法導論》,還有,波利亞的《怎樣解題》

 

 ==============================

歸根結底,面試的算法其實不只是算法而已,面試官看重的是從做題過程中體現出的思考問題的能力,而不是最終的結果本身。你和面試官之間是一場配合和博弈,你需要勾引面試官給你反饋,並抓住它們輔助思考,從而讓他們滿意。算法在面試中的地位,好比是託福在出國中的地位一樣,必須但不是最重要的,它只是考量的各個方面的一部分,不一定就決定生死。所以,有就讓它更好點,沒有就稍微補充點,足矣。我做過的面試其實不多,有的還不錯,有的就像坨屎,只希望,從今往後,努力讓我的面試遠離糞坑。。。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jeiwt/archive/2010/01/21/5220640.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章