【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

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