剑指offer目录

小菜鸡也开始慢慢接触剑指offer啦,做一个目录方便以后查找

链表

链表的基础知识
链式线性表的基础知识
链式线性表的完整实现附代码
剑指offer中链表的相关题目如下所示。链表的相关题目对栈和链式存储的操作比较灵活,做题过程中需要考虑几个方面的因素:

  1. 算法的鲁棒性:每道题都要考虑空链表的可能性。比如面试题18_1删除链表的节点,需要考虑删除的节点处于头部、尾部、中间三种情况。
  2. 算法的技巧性: 两个指针的使用。如面试题22定义两个指针,让指针间隔k-1个节点,当走的早的指针指到末尾时,走的晚的指针刚好位于倒数第k个位置。如面试题52也是使用到两个指针,让指针在长链表上先走若干步,然后两个指针同时在长短链表上移动,当两个指针相同时,就是第一个公共节点。
  3. 算法先思考再编写:面试题23需要考虑依次考虑链表中是否有环、环的节点数、环的入口结点。只有考虑清楚解决题目的逻辑关系,就容易编写代码。
  4. 扎实的基本功:栈作为一种后进先出的存储结构非常适合面试题6,把链表元素存储在栈中并从栈顶输出;因为栈的应用--递归,所以面试题6优化算法可以使用递归实现。同理,面试题25也是递归的完美体现。依次比较并找出两个链表中较小的元素。
  • 面试题6:从尾到头打印链表
  • 面试题18_1:在O(1)时间内删除链表中的节点
  • 面试题18_2:删除链表中重复的节点
  • 面试题22:链表中倒数第k个节点
  • 面试题23:链表中环的入口节点
  • 面试题25:合并两个排序的链表
  • 面试题52:两个链表的第一个公共节点
  • 面试题24:反转链表

树的基础知识
二叉树的基础知识
创建二叉树并附完整代码

树的创建和遍历
  • 面试题32(1):从上到下打印二叉树(不分行)从上到下按行遍历二叉树,就是广度优先遍历二叉树
  • 面试题32(2):分行从上到下打印二叉树 从上到下按行遍历二叉树,每行二叉树节点打印之后换行。
  • 面试题32(3):之字形打印二叉树 每一行打印二叉树节点的顺序相反。

二叉搜索树意味着该树是有序的。进一步解释为该树如果有左子树,则左子树所有节点的值均小于根节点的值,如果该树有右子树,则右子树所有节点的值均大于根节点的值。

  • 面试题37:序列化二叉树 讲述由字符串创建二叉树的序列化过程和二叉树反序列化为字符串的过程。考察如何创建二叉树的基础知识创建二叉树并附完整代码
  • 面试题33:二叉搜索树的后序遍历序列考察后续遍历的特点,和第7题同一思路。
  • 面试题7:重建二叉树给出前序遍历和中序遍历结果重建二叉树
  • 面试题26:树的子结构考察二叉树的遍历算法
  • 面试题34:二叉树中和为某一值的路径 考察前序遍历
  • 面试题8:二叉树的下一个节点 考察中序遍历,找的是中序遍历的下一个节点
    面试题54:二叉搜索树的第k大节点 考察中序遍历中的第k个节点。因为二叉搜索树的中序遍历是递增的。
树的性质
  • 面试题55(1):二叉树的深度
  • 面试题55(2):平衡二叉树,由二叉树的深度延伸出由深度可以判断该树是否是平衡二叉树。
树的综合考察
  • 面试题27:二叉树的镜像
  • 面试题28:对称的二叉树递归和遍历算法的运算很奇妙
  • 面试题68:树中两个节点的最低公共祖先

字符串

会考察指针
c++的字符串类型string和字符类型char

  • 面试题5:替换空格从后往前替换的方法值得学习和借鉴。
  • 面试题19:正则表达式匹配
  • 面试题20:表示数值的字符串
  • 面试题38:字符串的排序
  • 面试题48:最长不含重复字符的子字符串
  • 面试题50(1):第一次只出现一次的字符
  • 面试题58(1):翻转字符串 先整体翻转,再根据每个单词翻转
  • 面试题58(2):左旋转字符串可以借鉴58(1)的思路,先分别翻转,再整体翻转。
  • 面试题67:把字符串转换成整数

栈和队列

栈和队列基础知识

  • 面试题9(1):用两个栈实现队列
  • 面试题9(2):两个队列实现一个栈
  • 面试题30:包含min函数的栈
  • 面试题31:栈的压入、弹出序列
  • 面试题59:队列的最大值

多维数组(矩阵)

  • 面试题4:二维数组中的查找
  • 面试题10(4):矩阵覆盖
  • 面试题12:矩阵中的路径
  • 面试题13:机器人的运动范围
  • 面试题29:顺时针打印矩阵
  • 面试题47:礼物的最大价值

数组

数组基础知识

  • 面试题3(1):找出数组中重复的数字

  • 面试题3(2):不修改数组找出重复的数字

  • 面试题10(1):斐波那契数列有递归和循环两种方法,各有优劣。

  • 面试题10(2):青蛙跳台阶问题

  • 面试题10(3):青蛙变态跳台阶问题

  • 面试题16:数值的整数次方

  • 面试题21:调整数组顺序使奇数位于偶数前面

  • 面试题43:1~n整数中1出现的次数

  • 面试题44:数字序列中某一位的数字

  • 面试题45:把数组排成最小的数

  • 面试题46: 把数字翻译成字符串

  • 面试题49:丑数

  • 面试题57(1):和为s的数字

  • 面试题57(2):和为s的连续正数序列

  • 面试题61:扑克牌中的顺子

  • 面试题62:圆圈中最后剩下的数字

  • 面试题63:股票的最大利润

  • 面试题66:构建乘积数组

动态规划和贪婪算法

  • 面试题14:剪绳子

  • 面试题42:连续子数组的最大和动态规划

排序和查找算法

排序和查找基础知识

  • 面试题39:数组中出现次数超过一半的数字用到快速排序算法

  • 面试题40:最小的k个数快速排序和STL容器multiset

  • 面试题51:数组中的逆序对归并排序

  • 面试题11:旋转数组的最小数字采用二分查找算法

  • 面试题53(1):在排序数组中查找数字采用二分查找算法

  • 试题53(2):0~n-1中缺失的数字采用二分查找算法

  • 面试题53(3):数组中数值和下标相等的元素采用二分查找算法

位运算

image.png

  • 面试题15:二进制中1的个数

  • 面试题56(1):数组中数字出现的次数

  • 面试题56(2):数组中唯一只出现一次的数字

  • 面试题65:不用加减乘除做加法

大数问题

  • 面试题17:打印从1到最大的n位数

C++基础

  • 面试题2:实现singleton模式
  • 面试题64:求1+2+....+n

总结

第一遍刷题,只能说理解思路,并不能完整的写出代码。还需要不断的重复理解-->写代码-->训练逻辑的这个过程。我已经把所有代码上传Github,因为在网上找的帖子大部分都只有子函数,对于我这种小白理解代码还是很费劲的。所以如果你和我一样,那么你可以去我的Github上找到某道题对应的完整代码,补充了主函数很容易理解,容易上手。看算法题的基本都是准备找工作的同伴,大家一起加油呀!

ps:2020春招差不多已经过去,作为垃圾学校的一名非垃圾学生,在写论文的道路上完美错误春招。本人十分悔恨,痛下决定用15天刷了一遍算法题。想能不能追上末班车。

你可能感兴趣的:(剑指offer目录)