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