經典算法面試題

1. 10億個數中取前1000大的數

維護一個1000個節點的小頂堆。算法

時間複雜度O(nlogk)數組

 

2. 合併k個有序(假設升序)數組

具體步驟:(1)將k個數組的第一個元素取出來,維護一個小頂堆。app

     (2)彈出堆頂元素存入結果數組中,並把該元素所在數組的下一個元素取出來壓入隊中。函數

     (3)調整堆的結構,使其知足小頂堆的定義。編碼

     (4)重複(2)(3)直到合併完成。指針

 

3. 給定一個正整數 N,須要把它分解成至少兩個不一樣的整數和,問有多少種不一樣的分解方案

動態規劃:dp[n][m]表示n被分解爲最大爲m的數的方案數code

\[dp\left[ n \right]\left[ m \right] = \sum\limits_{k = 1}^{m - 1} {dp\left[ {n - m} \right]\left[ k \right]} \]排序

 

4. 一個數組怎麼輸出前K大的值、時間複雜度。

藉助快排partition的思想,平均時間複雜度是O(n)遞歸

 

5. 查找數組中出現次數超過一半的數字

等價於求數組中第n/2大的數,和4中思想同樣,平均時間複雜度O(n)leetcode

 

6.二維數組查找(劍指offer)

在一個二維數組中(每一個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

 

思路分析:咱們注意到這個二維數組的行和列都是升序的,也就是說最上面的一行和最右邊的一列在總體上也是升序的,在一個排序數組上查找某個咱們會很天然的想起二分法。這樣咱們每次都把要查找的數和當前剩下的二維數組的右上角數字比較,這樣每次咱們均可以排除掉一行或一列。算法的時間複雜度是O(n+m),也就是行數加列數。

 

7.數組中插入數字

題一:替換空格(劍指offer)

請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。

 

題二:兩個排序數組A1和A2,如今想把A2插入A1中並仍保持有序。

 

思路分析:數組是個順序表,咱們往數組中插入某個數的話必需要移動當前位置後面全部的數。常規的思路是每次插入一個數並移動後面的數,這樣屢次插入後會致使數組中有的數被移動了屢次,極大浪費了效率。咱們但願每一個數移動一次就到達它最終的位置,因此咱們每每會反向移動數組,這樣作的好處是移動當前數時後面的數已經到達了最終位置,咱們移動當前數不會影響到後面的數,這樣就確保了每一個數只被移動一次。

 

8. 合併兩個無序鏈表成一個有序鏈表,只能用常數空間。

歸併排序的思想,用快慢指針不斷二分鏈表。

 

9. 斐波那契數列高效計算

斐波那契數列:f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)

方法一:遞歸,效率低

方法二:循環,正着推

方法三:矩陣運算

 

10. 用A表示1第一列,B表示2第二列,。。。,Z表示26,AA表示27,AB表示28。。。以此類推。請寫出一個函數,輸入用字母表示的列號編碼,輸出它是第幾列。

解題思路:26進制轉10進制。

 

11. 輸出一個整數二進制表示中1的個數

解法1:右移原數判斷,若是輸入是負數可能陷入死循環。

解法2:左移1

解法3:把一個整數-1後與原數作與運算會消去原數最左邊的1

 

12. 最小方差劃分

把一個數組劃分紅兩部分,使其方差和最小。

D(X) = E(x^2) - [E(X)]^2

迭代求和。

 

13. 波蘭式和逆波蘭式相關問題

計算(1+((2+3)*(4*5))),leetcode224

 

14. 給定一個整數序列,你能夠刪去其中的連續一段(能夠不刪),求刪去後數組的最大連續子段和。(招商銀行M-Geeker競賽)

解題思路:最大連續子序列的變種題,從前日後遍歷一遍求最大連續子序列和,而後從後往前遍歷一遍求最大連續子序列和。

思路拓展:對於刪去中間一段很差直接操做的話,能夠先從前日後遍歷,在從後往前遍歷。

 

15. 小明要在t分鐘以內作l張餅,有n個鍋,但只能選其中k個鍋,每一個鍋每分鐘能作vi個餅,最多能作mi個餅,問能不能作完l張餅,若是能,輸出最少須要多少分鐘;若是不能,輸出最多能作幾張餅。

解法: 先討論能不能作完:每一個鍋在t分鐘內能作的餅數爲min(mi,vi*t), 降序排列,前k個鍋能作出來的餅>l就能; 若是不能作完:直接輸出前k個鍋能作餅的和;若是能:二分最短期,而後判斷在mid分鐘內能不能作完餅,判斷方法同t分鐘的狀況。

思路:查詢時先想一下二分。

 

16. O(1)時間刪除鏈表指定節點(給定單向鏈表的頭指針和一個節點指針)

解題思路:把該節點下個節點的值複製到該節點,刪除下個節點(注意該節點是尾節點和鏈表只有一個節點的特殊狀況)

相關文章
相關標籤/搜索