【JavaScript】用JS刷劍指offer

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。

題目分析

我們如果要替換空格,兩步

  1. 先知道空格的位置
  2. 替換,但是字符串中有多個空格,所以我們就要循環,替換完之後再去查找字符串空格位置

當然你也可以選擇用正則

代碼

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

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