#程序员面试必备#《剑指Offer》从零单刷个人笔记整理(66题全)

版权声明:本文为博主NJU_ChopinXBP原创文章,发表于CSDN,仅供交流学习使用,转载请私信或评论联系,未经博主允许不得转载。感谢您的评论与点赞。 https://blog.csdn.net/qq_20304723/article/details/88367207

《剑指Offer》以面试题为主,代码大都不长。比较适合两种人,第一种是新手入门,第二种是面前备战。

我就是以新手的姿态来刷这本书的,每一道题先按自己的思路写一遍,然后尽可能尝试所有的方法实现并调优,然后再把感想和总结以博客的形式进行记录和分享。有时候学业繁重加上各种比赛或者假期,更新会断断续续;有时候刷题速度太快,堆积了很多已经写好的代码没有及时总结(因为尽量一天只发一篇博客,但是有时候兴起一天不止刷一道题)。

不管怎么样总算是刷完转战LeetCode,写下这篇文章的时候LeetCode已经积累了几十题,估计近期会新开板块继续记录和分享,还是可以保持一定的更新频率的。


由于本人学习语言主Java,辅C++,所以每题用Java写完后都会再过一下C++的解法过程,但是大多数算法题上两者基本思想没有区别,只是实现方式不同。

前面的题目因为不是很难,可能记录不是很多,后面开始比较用心地进行原理和方法的剖析,每道题都用几乎所有可行的方法进行了实现和调优,大多数题目都附上了测试用例,少数题目进行了一些升级和扩充

附上每道题解答传送门之前会对该题进行评分评价。评价方式分为两点,实现难度指的是不考虑复杂度完成代码通过的难度(决定题目难度下限),优化难度指的是写出考虑周全且复杂度降至最低的算法的难度(决定题目难度上限),优化难度不小于实现难度。评价基线为刷这道题的新手平均水平,满分★★★★★。困难评级直接参考优化难度。


欢迎大家点赞关注收藏!


1. 二维数组中的查找(实现难度:★★,优化难度:★★) 简单

关键词:数组、动态规划、二分查找

#数据结构与算法学习笔记#剑指Offer1:二维数组中的查找(JAVA、C/C++)


2. 替换空格(实现难度:★,优化难度:★★) 简单

关键词:字符串、replaceAll

#数据结构与算法学习笔记#剑指Offer2:替换空格(Java、C/C++)


3. 从尾到头打印链表(实现难度:★,优化难度:★) 简单

关键词:栈、链表

#数据结构与算法学习笔记#剑指Offer3:从尾到头打印链表(Java、C/C++)


4. 先序遍历+中序遍历重建二叉树(实现难度:★★★☆,优化难度:★★★☆) 中等

关键词:找规律、递归、二叉树、先序遍历、中序遍历

#数据结构与算法学习笔记#剑指Offer4:先序遍历+中序遍历重建二叉树(Java、C/C++)


5. 用两个栈实现队列(实现难度:★★,优化难度:★★) 简单

关键词:栈、队列

#数据结构与算法学习笔记#剑指Offer5:用两个栈实现队列(Java、C/C++)


6. 旋转数组的最小数字(实现难度:★★☆,优化难度:★★☆) 简单

关键词:数组、二分查找

#数据结构与算法学习笔记#剑指Offer6:旋转数组的最小数字(Java、C/C++)


7. 斐波那契数列(实现难度:★★★,优化难度:★★★☆)中等

关键词:斐波那契数列

#数据结构与算法学习笔记#剑指Offer7:斐波那契数列的四种编程实现方法 + 测试用例(Java、C/C++)


8. 普通青蛙跳台阶+变态青蛙跳台阶(实现难度:★★★★,优化难度:★★★★)困难

关键词:斐波那契数列、找规律、公式推导

#数据结构与算法学习笔记#剑指Offer8:普通青蛙跳台阶+变态青蛙跳台阶+最清晰数学归纳法证明(Java、C/C++)


9. 矩形覆盖(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:斐波那契数列、找规律

#数据结构与算法学习笔记#剑指Offer9:矩形覆盖智力题+斐波那契数列(Java、C/C++)


10. 求二进制中1的个数(实现难度:★,优化难度:★★★☆)中等

关键词:位运算、找规律

#数据结构与算法学习笔记#剑指Offer10:位运算:求二进制中1的个数+四种解法比较+测试用例(Java、C/C++)


11. 求数值的整数次方(实现难度:★☆,优化难度:★★☆) 简单

关键词:库函数、浮点数、找规律

#数据结构与算法学习笔记#剑指Offer11:求数值的整数次方/实现库函数pow + 判断double为0 + 测试用例(Java、C/C++)


12. 调整数组顺序使奇数位于偶数之前(实现难度:★★★,优化难度:★★★)中等

关键词:数组、多指针移动

#数据结构与算法学习笔记#剑指Offer12:调整数组顺序使奇数位于偶数之前原版+升级版+测试用例(Java、C/C++)


13. 求链表中倒数第K个结点(实现难度:★★★,优化难度:★★★☆)中等

关键词:链表、多指针移动

#数据结构与算法学习笔记#剑指Offer13:求链表中倒数第K个结点+测试用例(Java、C/C++)


14. 反转链表(实现难度:★★★,优化难度:★★★☆)中等

关键词:链表、递归、多指针移动

#数据结构与算法学习笔记#剑指Offer14:反转链表+非递归思路与递归思路+PTA升级版+测试用例(Java、C/C++)


15. 顺序链表合并(实现难度:★★,优化难度:★★) 简单

关键词:链表、归并

#数据结构与算法学习笔记#剑指Offer15:顺序链表合并+测试用例(Java、C/C++)


16. 是否为二叉树的子树(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、递归

#数据结构与算法学习笔记#剑指Offer16:是否为二叉树的子树+测试用例(Java、C/C++)


17. 镜像二叉树+同构二叉树(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、递归

#数据结构与算法学习笔记#剑指Offer17:镜像二叉树+升级版同构二叉树+测试用例(Java、C/C++)


18. 顺时针打印矩阵(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:数组、找规律

#数据结构与算法学习笔记#剑指Offer18:顺时针打印矩阵 + 测试用例(Java、C/C++)


19. 最小栈/包含min函数的栈(实现难度:★★★,优化难度:★★★☆)中等

关键词:栈

#数据结构与算法学习笔记#剑指Offer19:最小栈/包含min函数的栈 + 测试用例(Java、C/C++)


20. 判断栈的压入弹出序列+变式版(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:栈、动态规划

#数据结构与算法学习笔记#剑指Offer20:判断栈的压入弹出序列+变式版+测试用例(Java、C/C++)


21. 从上往下打印二叉树/层次遍历二叉树(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、层次遍历、队列

#数据结构与算法学习笔记#剑指Offer21:从上往下打印二叉树/层次遍历二叉树(Java、C/C++)


22. 二叉搜索树的后序遍历序列(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:二叉树、递归、二分查找、后序遍历

#数据结构与算法学习笔记#剑指Offer22:判断是否二叉搜索树的后序遍历序列 + 测试用例(Java、C/C++)


23. 二叉树中和为某一值的路径(实现难度:★★★★,优化难度:★★★★)困难

关键词:二叉树、递归、剪枝、容器排序

#数据结构与算法学习笔记#剑指Offer23:二叉树中和为某一值的路径 + 嵌套容器类排序3种实现 + 测试用例(Java、C/C++)


24. 复杂链表复制(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:链表、哈希表

#数据结构与算法学习笔记#剑指Offer24:复杂链表复制 + 4种实现方法比较 + 哈希表使用 + 测试用例(Java、C/C++)


25. 二叉搜索树转双向链表(实现难度:★★★★,优化难度:★★★★☆)困难

关键词:二叉树、链表、递归、中序遍历

#数据结构与算法学习笔记#剑指Offer25:二叉搜索树转双向链表 + 先序与中序遍历做法 + 测试用例(Java、C/C++)


26. 字符串的排列升级版(实现难度:★★★★,优化难度:★★★★★)困难

关键词:字符串、全排列、字典序、递归、回溯法、红黑树

#数据结构与算法学习笔记#剑指Offer26:字符串的排列升级版 + 去重全排列问题3种解法 + 字典序算法 + 测试用例(Java、C/C++)


27. 数组中出现次数超过一半的数字(实现难度:★★☆,优化难度:★★★☆)中等

关键词:数组、哈希表、快速排序、在线处理、动态规划、中位数

#数据结构与算法学习笔记#剑指Offer27:数组中出现次数超过一半的数字 + 3种解法 + 测试用例(Java、C/C++)


28. 连续子数组最大和(实现难度:★★,优化难度:★★★☆)中等

关键词:数组、分治算法、动态规划

#数据结构与算法学习笔记#剑指Offer28:连续子数组最大和 + 分治算法/动态规划 + 测试用例(Java、C/C++)


29. 整数中1出现的次数(实现难度:★★★★,优化难度:★★★★★)困难

关键词:找规律、递归

#数据结构与算法学习笔记#剑指Offer29:整数中1出现的次数 + 分段思想/按位考虑 + 测试用例(Java、C/C++)


30. 把数组排成最小的数(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:数组、全排列、红黑树、自定义比较器

#数据结构与算法学习笔记#剑指Offer30:把数组排成最小的数 + 自定义比较器 + 测试用例(Java、C/C++)


31. 丑数(实现难度:★★★,优化难度:★★★☆)中等

关键词:找规律、在线处理

#数据结构与算法学习笔记#剑指Offer31:丑数 + 测试用例(Java、C/C++)


32. 第一个只出现一次的字符(实现难度:★★,优化难度:★★★)中等

关键词:字符串、在线处理、哈希表

#数据结构与算法学习笔记#剑指Offer32:第一个只出现一次的字符 + 在线处理/哈希表 + 测试用例(Java、C/C++)


33. 数组中的逆序对(实现难度:★★,优化难度:★★★☆)中等

关键词:数组、归并排序、分治算法

#数据结构与算法学习笔记#剑指Offer33:数组中的逆序对 + 归并排序 + 测试用例(Java、C/C++)


34. 两个链表的第一个公共结点(实现难度:★★,优化难度:★★☆)简单

关键词:链表、多指针移动、栈

#数据结构与算法学习笔记#剑指Offer34:两个链表的第一个公共结点 + 等长遍历/辅助栈 + 测试用例(Java、C/C++)


35. 数字在排序数组中出现的次数(实现难度:★,优化难度:★★★)中等

关键词:数组、二分查找

#数据结构与算法学习笔记#剑指Offer35:数字在排序数组中出现的次数 + 测试用例(Java、C/C++)


36. 二叉树的深度(实现难度:★★,优化难度:★★) 简单

关键词:二叉树、递归

#数据结构与算法学习笔记#剑指Offer36:二叉树的深度(Java)


37. 是否平衡二叉树/AVL树(实现难度:★★★,优化难度:★★★☆)中等

关键词:二叉树、递归、后序遍历

#数据结构与算法学习笔记#剑指Offer37:是否平衡二叉树/AVL树 + 测试用例(Java、C/C++)


38. 数组中只出现一次的数字(实现难度:★★,优化难度:★★★☆)中等

关键词:数组、位运算

#数据结构与算法学习笔记#剑指Offer38:数组中只出现一次的数字 + 测试用例(Java、C/C++)


39. 和为S的连续正数序列(实现难度:★★★,优化难度:★★★★)困难

关键词:找规律、动态规划

#数据结构与算法学习笔记#剑指Offer39:和为S的连续正数序列 + 序列规律/动态规划 + 测试用例(Java、C/C++)


40. 和为S的两个数字(实现难度:★,优化难度:★★) 简单

关键词:数组、多指针位移

#数据结构与算法学习笔记#剑指Offer40:和为S的两个数字 + 测试用例(Java、C/C++)


41. 左旋转字符串(实现难度:★,优化难度:★★) 简单

关键词:字符串、库函数

#数据结构与算法学习笔记#剑指Offer41:左旋转字符串 + 测试用例(Java、C/C++)


42. 翻转单词顺序列(实现难度:★★,优化难度:★★) 简单

关键词:字符串

#数据结构与算法学习笔记#剑指Offer42:翻转单词顺序列 + 测试用例(Java、C/C++)


43. 扑克牌顺子(实现难度:★★★,优化难度:★★★)中等

关键词:动态规划

#数据结构与算法学习笔记#剑指Offer43:扑克牌顺子 + 动态规划 +测试用例(Java、C/C++)


44. 圆圈中最后剩下的数字/约瑟夫环问题(实现难度:★★★★,优化难度:★★★★)困难

关键词:找规律、公式推导

#数据结构与算法学习笔记#剑指Offer44:圆圈中最后剩下的数字(约瑟夫环问题) + 公式证明 + 测试用例(Java、C/C++)


45. 发散思维求1到n的和(实现难度:★★★☆,优化难度:★★★☆)中等

关键词:短路、异常、数组空间、构造函数、虚函数、函数指针、模版类型、快速幂分解

#数据结构与算法学习笔记#剑指Offer45:发散思维求1到n的和 + 8种方法实现(Java、C/C++)


46. 不用加减乘除做加法(实现难度:★★★,优化难度:★★★)中等

关键词:位运算

#数据结构与算法学习笔记#剑指Offer46:不用加减乘除做加法(Java、C/C++)


47. 把字符串转换成整数(实现难度:★★,优化难度:★★★)中等

关键词:字符串、库函数

#数据结构与算法学习笔记#剑指Offer47:把字符串转换成整数(Java、C/C++)


48. 数组中重复的数字(实现难度:★☆,优化难度:★★☆) 简单

关键词:数组、哈希表

#数据结构与算法学习笔记#剑指Offer48:数组中重复的数字(Java、C/C++)


49. 构建乘积数组(实现难度:★★★,优化难度:★★★☆)中等

关键词:数组、矩阵、找规律

#数据结构与算法学习笔记#剑指Offer49:构建乘积数组(Java、C/C++)


50. 正则表达式匹配(实现难度:★★★★,优化难度:★★★★☆)困难

关键词:字符串、正则表达式、递归

#数据结构与算法学习笔记#剑指Offer50:正则表达式匹配(Java、C/C++)


51. 表示数值的字符串(实现难度:★★★,优化难度:★★★☆)中等

关键词:字符串、正则表达式、逻辑分类

#数据结构与算法学习笔记#剑指Offer51:表示数值的字符串 + 正则表达式(Java、C/C++)


52. 字符流中第一个不重复的字符(实现难度:★★,优化难度:★★☆) 简单

关键词:字符流、哈希表

#数据结构与算法学习笔记#剑指Offer52:字符流中第一个不重复的字符(Java、C/C++)


53. 链表中环的入口结点(实现难度:★★,优化难度:★★) 简单

关键词:链表、哈希表、多指针移动

#数据结构与算法学习笔记#剑指Offer53:链表中环的入口结点(Java、C/C++)


54. 删除链表中重复的结点(实现难度:★★,优化难度:★★) 简单

关键词:链表、哈希表、递归

#数据结构与算法学习笔记#剑指Offer54:删除链表中重复的结点(Java、C/C++)


55. 二叉树的下一个结点(实现难度:★★★,优化难度:★★★☆)中等

关键词:二叉树、中序遍历、找规律

#数据结构与算法学习笔记#剑指Offer55:二叉树的下一个结点(Java、C/C++)


56. 对称的二叉树(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、递归

#数据结构与算法学习笔记#剑指Offer56:对称的二叉树(Java、C/C++)


57. 按之字形顺序打印二叉树(实现难度:★★★,优化难度:★★★☆)中等

关键词:二叉树、队列、层次遍历

#数据结构与算法学习笔记#剑指Offer57:按之字形顺序打印二叉树(Java、C/C++)


58. 把二叉树打印成多行(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、队列、层次遍历

#数据结构与算法学习笔记#剑指Offer58:把二叉树打印成多行(Java、C/C++)


59. 序列化二叉树(实现难度:★★★,优化难度:★★★☆)中等

关键词:二叉树、序列化、递归、先序遍历

#数据结构与算法学习笔记#剑指Offer59:序列化二叉树(Java、C/C++)


60. 二叉搜索树的第K个结点(实现难度:★★★,优化难度:★★★)中等

关键词:二叉树、中序遍历

#数据结构与算法学习笔记#剑指Offer60:二叉搜索树的第K个结点(Java、C/C++)


61. 数据流中的中位数(实现难度:★★★,优化难度:★★★☆)中等

关键词:数据流、最大堆、最小堆

#数据结构与算法学习笔记#剑指Offer61:数据流中的中位数 + 最大堆 + 最小堆(Java、C/C++)


62. 滑动窗口的最大值(实现难度:★★★,优化难度:★★★☆)中等

关键词:数组、在线处理

#数据结构与算法学习笔记#剑指Offer62:滑动窗口的最大值 + 在线处理(Java、C/C++)


63. 矩阵中的路径(实现难度:★★★★,优化难度:★★★★)困难

关键词:数组、回溯法

#数据结构与算法学习笔记#剑指Offer63:矩阵中的路径 + 回溯法(Java、C/C++)


64. 机器人的运动范围(实现难度:★★★★,优化难度:★★★★)困难

关键词:数组、回溯法

#数据结构与算法学习笔记#剑指Offer64:机器人的运动范围 + 回溯法(Java、C/C++)


65. n个骰子的点数和(实现难度:★★★,优化难度:★★★★☆)困难

关键词:找规律、递归

#数据结构与算法学习笔记#剑指Offer65:n个骰子的点数和 + 详细解析(Java、C/C++)


66. 不能被继承的类(实现难度:★★★,优化难度:★★★☆)中等

关键词:构造函数、虚继承

#数据结构与算法学习笔记#剑指Offer66:不能被继承的类(C/C++)


#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

猜你喜欢

转载自blog.csdn.net/qq_20304723/article/details/88367207
今日推荐