1 二維數組的查找
題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
題目分析
該二維數組中的一個數,它左邊的數都比它小,下邊的數都比它大。因此,從右上角開始查找,就可以根據 target 和當前元素的大小關係來縮小查找區間,當前元素的查找區間爲左下角的所有元素。
代碼
function Find(target, array) {
// 邊界條件
if (array == null || array.length === 0 || array[0].length === 0) {
return false;
}
var rows = array.length;
var cols = array[0].length;
var r = 0;
var c = cols - 1;
while (r <= rows - 1 && c >= 0) {
if (target == array[r][c]) {
return true;
} else if (target > array[r][c]) {
r++;
} else {
c--;
}
}
return false;
}
2 替換空格
題目描述
請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
題目分析
我們如果要替換空格,兩步
- 先知道空格的位置
- 替換,但是字符串中有多個空格,所以我們就要循環,替換完之後再去查找字符串空格位置
當然你也可以選擇用正則
代碼
function replaceSpace(str)
{
return str.replace(/\s/g, '%20')
}
3 從尾到頭打印鏈表 簡單 棧
4 重建二叉樹 中等 畫圖、遞歸、注意下標
5 用兩個棧實現隊列 簡單 注意判斷條件
6 旋轉數組中的最小數字 簡單 二分法
7 斐波那契數列 簡單 動態規劃
8 跳臺階 簡單 動態規劃
9 變態跳臺階 中等 類似斐波那契、數學分析
10 矩形覆蓋 簡單偏難 類似斐波那契
二進制中1的個數 中等 位運算n=n&n-1
數值的整數次方 中等 數學分析、位運算
調整數組順序使奇數位於偶數前面 簡單 兩個變量作爲奇數和偶數的下標
鏈表中倒數第k個節點 簡單 雙指針法
反轉鏈表 簡單 三個指針
合併兩個排序的鏈表 簡單 遞歸
樹的子結構 簡單偏難 注意判斷條件、遞歸
二叉樹的鏡像 簡單 遞歸
順時針打印矩陣 中等偏難 注意判斷條件、遞歸 || 模擬魔方法
包含min函數的棧 中等 輔助棧
棧的壓入、彈出序列 中等 輔助棧
從上往下打印二叉樹 簡單 廣度遍歷、隊列
二叉樹的後續遍歷序列 中等 畫圖
二叉樹和爲某一值的遍歷序列 中等 深度遍歷、遞歸
複雜鏈表的複製 難 map保存<N,N’> || N->N’得S->S‘
二叉搜索樹與雙向鏈表 中等偏難 遞歸、中序遍歷
字符串的排列 難 回溯法 || 遞歸全排列法
數組中出現次數超過一半的數 中等 partion法 || times變量變化法
最小的k個數 中等 partion法
連續子數組的最大值 中等 找規律、動態規劃、注意判斷條件
(~n整數中1出現的次數 中等 位運算 || 數學分析
把數組排成最小的數 簡單偏難 改變排序規則
醜數 難 動態規劃、注意判斷條件
第一個只出現一次的字符 哈希表記錄
數組中的逆序對 難+ 基於歸併排序、臨時數組
兩個鏈表中的第一個公共節點 簡單 雙指針法
數字在排序數組中出現的次數 簡單偏難 二分法改造
二叉樹的深度 簡單 遞歸
平衡二叉樹 簡單 遞歸
數組中只出現一次的數字 簡單 indexOf || map記錄 || 異或
和爲S的連續正數序列 中等 數學分析
和爲S的字符串 簡單 雙指針
左旋轉字符串 簡單 裁剪拼接
單次翻轉序列 簡單 轉數組,對每項反序
撲克牌順子 中等 注意題目條件、位運算判斷數字重複
孩子們的遊戲 難 數學分析得出公式 || 畫圖按題目做、注意下標
求1+2+3+…+n 中等 位運算、遞歸
不用加減乘除做加法 中等 位運算
把字符串轉成整數 中等 位運算
數組中重複的數字 中等 將值放到對應位置上
構建乘積數組 中等偏上 藉助中間變量存儲後面的乘積
正則表達式的匹配 難 注意判斷條件、遞歸
表示數值的字符串 中等 正則
字符流中第一個不重複的數字 中等 map記錄 || indexOf法
鏈表中環的入口節點 中等 雙指針法、數學分析
刪除鏈表中重複的節點 中等 加頭節點、注意多個重複
二叉樹的下一個節點 中等 畫圖、分析各種情況
對稱的二叉樹 中等 遞歸、對稱遍歷
按之字形順序打印二叉樹 難 廣度遍歷、兩個棧
把二叉樹打印成多行 中等偏難 隊列+兩個記錄變量
序列化二叉樹 中等 數組代表流、遞歸
二叉搜索樹的第k個節點 中等 中序遍歷+計數變量
數據流的中位數 中等 partion法 || 維持排序 || 排序鏈表法 || AVL樹 || 最大堆和最小堆
滑動窗口中的最大值 難 改變參考對象、雙端隊列、存下標
矩陣中的路徑 中等 回溯法
機器人的運動範圍 中等 回溯法
參考資料
[1] https://www.cnblogs.com/wuguanglin/p/code-interview.html
[2] https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/劍指 Offer 題解 - 目錄1.md
[3] https://www.cnblogs.com/wuguanglin/p/SummaryOfJSDoAlgorithmProblem.html