剑指offer大全
写在前面
一般来说对于刷剑指offer分为几刷
- 速刷,不懂直接题解,获得正解。
- 默刷,看一遍题解,进行默写,进行巩固
- 日刷,每日三省吾身,隔日能刷方更进一步
- 月刷,在完成全部题目后,要时不时的进行回顾“思而不学则殆”,要一直动起来,刷起来,速度更是要快。“题刷百变,其意必现”
最后,我们才可以刷更多更有难度的题,但是万变不离其宗,最简单的剑指offer就是我们必修的内功!
题目题解表
剑指offer题号 | 题解地址 | 总而言之 |
---|---|---|
JT1 | 二维数组中的查找 | 优雅的暴力总是那么迷人 |
JT2 | 替换空格 | 花里胡哨终会将时间错付 |
JT3 | 从尾到头打印链表 | 为了节约空间我选择自转 |
JT4 | 重建二叉树 | 破镜难以重圆,但是二叉树可以 |
JT5 | 用两个栈实现队列 | 要用魔法打败魔法 |
JT6 | 旋转数组的最小数字 | 谁暴力谁是傻子 |
JT7 | Fibonacci数列 | 记忆化搜索很重要 |
JT8 | 跳台阶 | 我一眼就看出不是跳台阶 |
JT9 | 变态跳台阶 | 一下支棱n级台阶,真牛 |
JT10 | 矩形覆盖 | 万事有起因,答案其中隐 |
JT11 | 二进制中1的个数 | n&(n-1)你不得不知道の含义呀0.0! |
JT12 | 数值的整数次方 | 抛砖引玉我们说说【快速幂】算法! |
JT13 | 调整数组循序使奇数位于偶数前面 | 过于简单 |
JT14 | 链表中倒数第k个结点 | 震惊!!!双指针相对运动轻松解题 |
JT15 | 反转链表 | 不积硅步无以至千里 |
JT16 | 合并两个排序的链表 | 不忘初心,方得始终 |
JT17 | 树的子结构 | 树的比较都是递归 |
JT18 | 二叉树的镜像 | 树的镜像也是递归 |
JT19 | 顺时针打印矩阵 | 正方形打野 |
JT20 | 包含min函数的栈 | 把最小值存下来不就好了? |
JT21 | 栈的压入,弹出序列 | 一直等到你的出现 |
JT22 | 从上往下打印二叉树 | 用队列好好保护树上的每个她! |
JT23 | 二叉搜索树的后序遍历序列 | 先苦后甜 |
JT24 | 二叉树中和为某一值的路径 | 答应我,不要放弃,把树跑完就行了 |
JT25 | 复杂链表的复制 | 按部就班太难,map最懂我 |
JT26 | 二叉搜索树与双向链表 | 琢磨了几天,挺抽象一题 |
JT27 | 字符串的排列 | 醉翁之意不在酒 |
JT28 | 数组种出现次数超过一半的数字 | 用哈希表支棱就完事了! |
JT29 | 最小的K个数 | 靓仔靓女,快进来学习快排讷! |
JT30 | 连续子数组的最大和 | 动态规划【全网最详图解】 |
JT31 | 从1到n整数中1出现的次数 | 万物有规律,特别是数字 |
JT32 | 把数组排成最小的数 | sort()竟然可以编写排序规则! |
JT33 | 丑数 | 客官进来抽个幸运数字呗! |
JT34 | ||
JT35 | ||
JT36 | ||
JT37 | ||
JT38 | ||
JT39 | ||
JT40 | ||
JT41 | ||
JT42 | ||
JT43 | ||
JT44 | ||
JT45 | ||
JT46 | ||
JT47 | ||
JT48 | ||
JT49 | ||
JT50 | ||
JT51 | ||
JT52 | ||
JT53 | ||
JT54 | ||
JT55 | ||
JT56 | ||
JT57 | ||
JT58 | ||
JT59 | ||
JT60 | ||
JT61 | ||
JT62 | ||
JT63 | ||
JT64 | ||
JT65 | ||
JT66 | ||
JT67 |
默写刷遇错集
JT4—重建二叉树
node->left=reBuiled(pre,vin,pre_left+1,pre_left+index-vin_left,vin_left, index-1);
node->right=reBuiled(pre,vin,pre_left+index-vin_left+1,pre_right,index+1,vin_right);
node->right的pre_left+index-vin_left +1
看似无大碍,但是因为pre_left+index-vin_left应该是该跟结点的最后一个左节点,但是恰恰就是因为没有+1会导致内存不够了,还是严谨一些,+1就是天衣无缝了!
JT12—数值的整数次方
在使用快速幂的过程中,在指数移位的时候掉了=,导致程序无法结束,从而程序超时
exponent>>=1;//正确的移位操作
exponent>>1;//由于掉了=,导致exponent一直没有改变,进入了死循环
JT14—链表中倒数第k个结点
双指针忘记判断fast快指针的出界return,导致了段错误。
while(k){
if(!fast) return nullptr;//如果出现了k大于链表成都的情况,这个判断就可以输出空
k--;
fast=fast->next;
}
JT16—合并两个排序的链表
1.返回值为head->next;如果返回的是head,那么会在最前面多出一个0,因为在申请空间的时候,表头的赋值是0.
2.while的条件,是直到其中一个链表跑完,这样,另外一个链表剩下的部分就都可以直接放到p->next后面了
while(pHead1&&pHead2)//正确的写法
while(!pHead1||!pHead2)//其中一个为零才开始循环 这是不对了,注意while,我们应该要的是,都不为零才开始循环
JT26—二叉搜索树与双向链表
JT35—数组中的逆序对
为什么调用了几次递归,子序列就是有序的讷?
题目分类表
数组
剑指offer题号 | 题解地址 |
---|---|
JT1 | 二维数组中的查找 |
JT7 | Fibonacci数列 |
JT13 | 调整数组循序使奇数位于偶数前面 |
JT19 | 顺时针打印矩阵 |
JT28 | 数组种出现次数超过一半的数字 |
JT32 | 把数组排成最小的数 |
字符串
剑指offer题号 | 题解地址 |
---|---|
JT2 | 替换空格 |
JT27 | 字符串的排列 |
链表
剑指offer题号 | 题解地址 |
---|---|
JT3 | 从尾到头打印链表 |
JT14 | 链表中倒数第k个结点 |
JT15 | 反转链表 |
JT16 | 合并两个排序的链表 |
JT25 | 复杂链表的复制 |
JT26 | 二叉搜索树与双向链表 |
树
剑指offer题号 | 题解地址 |
---|---|
JT4 | 重建二叉树 |
JT17 | 树的子结构 |
JT18 | 二叉树的镜像 |
JT22 | 从上往下打印二叉树 |
JT23 | 二叉搜索树的后序遍历序列 |
JT24 | 二叉树中和为某一值的路径 |
数学
剑指offer题号 | 题解地址 |
---|---|
JT11 | 二进制中1的个数 |
JT12 | 数值的整数次方 |
JT31 | 从1到n整数中1出现的次数 |
JT33 | 丑数 |
其他知识点
剑指offer题号 | 题解地址 | 知识点 |
---|---|---|
JT5 | 用两个栈实现队列 | 栈 |
JT6 | 旋转数组的最小数字 | 二分 |
JT8 | 跳台阶 | 递归 |
JT9 | 变态跳台阶 | 贪心 |
JT10 | 矩形覆盖 | 递归 |
JT20 | 包含min函数的栈 | 栈 |
JT21 | 栈的压入,弹出序列 | 栈 |
JT29 | 最小的K个数 | 快排 |
JT30 | 连续子数组的最大和 | 动态规划 |