面試編程題模式總結

  1. 滑動窗口
    應用場景:
    (1) 輸入是線性數據結構,比如鏈表,數組,字符串
    (2) 問題是找到最長或者最短的子串或者找到一個期望值
    典型案例:
    (1) 給定長度爲k,求和最大的子數組
    (2) 有‘k’個不同字符的最長的子字符串
    (3) 字符串迴文構詞法
  2. 雙指針
    應用場景:
    (1) 從有序數組(鏈表)中找到一組滿足特定約束的元素
    (2) 這一組元素要麼是二元組,要麼是三元組,甚至多元組
    典型案例:
    (1) 求有序數組的平方
    (2) 找到和爲0的三元組
    (3) 比較包含回車的字符串
  3. 快速指針和慢速指針(慢指針在一圈內一定會與快指針相遇)
    應用場景:
    (1) 問題是解決鏈表或者數組內的循環
    (2) 尋找一個鏈表中的某個特定的元素或者求鏈表的總長
    典型案例:
    (1) 循環鏈表
    (2) 迴文鏈表
    (3) 循環數組中的圈
  4. 合併區間(如果存在重疊區間需要找出這些重疊區間或者合併區間)
    應用場景
    (1) 生成沒有交集的列表
    (2) 重疊區間
    典型案列
    (1) 區間交集
    (2) 最大的CPU負載
  5. 循環排序(給定一定範圍內的連續數)
    應用場景
    (1) 涉及到給定範圍內的數字的有序數組
    (2) 在有序或者輪轉數組中找到缺失或者重複或者最小的數
    典型案例
    (1) 找到缺失的數
    (2) 找到缺失的最小正數
  6. 鏈接鏈表最佳翻轉方案(在一定的限制條件下翻轉鏈表,比如不能使用額外的空間)
    應用場景:不能使用額外的空間的情況下翻轉鏈表
    典型案列
    (1) 翻轉子鏈表
    (2) 翻轉子鏈表的每k個元素
  7. 廣度遍歷樹(基於廣度優先搜索技術遍歷樹,在跳到下一層級之前使用隊列來記錄當前層的所有節點,判斷條件爲隊列是否爲空)
    應用場景:涉及到層次遍歷樹
    典型案列
    (1) 二叉樹的層次遍歷
    (2) 之字形遍歷
  8. 深度遍歷樹(基於深度優先檢索技術遍歷樹,可以使用遞歸或者棧,判斷條件爲當前節點是否是葉子節點)
    應用場景
    (1) 前序,中序或者後序遍歷樹
    (2) 需要搜索接近葉節點的一些任務
    典型案列
    (1) 求樹中值的和爲特定值的路徑
    (2) 滿足某些條件的路徑的條數
  9. 雙堆(涉及二叉搜索)
    應用場景
    (1) 優先隊列,調度場景
    (2) 從一個集合中找到最大,最小,居中的元素
    (3) 以二叉樹結構爲特徵的問題
    典型案列:找到一個序列的中值
  10. 子集
  11. 改進的二叉搜索(找出某個確定的元素,最好的方法就是二分搜索)
    應用場景
    (1) 無序的二叉搜索
    (2) 在一個有序的無窮的列表中搜索
    典型案列
    一般的解答方法
    (1) 找到中位數
    (2) 如果查找的數等於該中位數,返回該中位數;如果查找的數小於該中位數,搜索列表的前面部分;否則搜索列表的後面部分
  12. 前k個元素
    應用場景
    (1)從給定的集合中找出最大的(最小的,最常出現的)前k個元素的問題
    典型案列
    (1) 前k個數
    (2) 前k個頻繁出現的數字
    一般解答方法
    (1) 往小頂堆插入k個元素
    (2) 遍歷剩餘的元素,如果發現一個比堆內的其中一個數據大時,移除堆頂元素,並將當前數插入
  13. K路合併
    應用場景
    (1) 以有序數組,列表或者矩陣爲特徵的問題
    (2) 合併有序列表,或者是查找有序列表的最小元素的問題
    典型案列
    (1) 合併k路有序列表
    (2) 可以得到最大和的k個數對
    解題的一般方法
    (1) 將每個隊列的第一個元素都插入小頂堆
    (2) 取出堆頂(最小)元素,將其添加到合併的列表內
    (3) 從堆頂移除最小的元素過後,將與移除元素相同的列表內的下一個元素插入堆
    (4) 重複第二步和第三步,生成合並後的有序列表
  14. 拓撲排序
    應用場景
    (1) 處理沒有環的圖
    (2) 問題涉及按順序更新所有對象
    (3) 存在遵循特定順序的一類對象
    典型案列
    (1) 任務調度
    (2) 樹的最小高度
    解題的一般方法
    (1) 初始化:使用hashmap將圖形存儲在相鄰列表中,找到所有的源節點,並使用hashmap保存節點的度數
    (2) 創建圖並求得所有頂點的入度:根據輸入創建圖,並填充節點的度數
    (3) 找到所有的源節點:標記爲“O”的節點爲源節點,將這些節點存儲到隊列
    (4) 排序:對每個源節點,執行以下操作(將它添加到源節點,從圖中獲得無它所有的孩子節點,將每個孩子節點的度數減少1,如果孩子節點是源節點,將其加入源節點隊列),重複上一步,直到源節點的隊列爲空
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章