![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
mayifan_blog
湖南大学,电气自动化,自学互联网
展开
-
剑指offer 合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解答思路:这是一道调整引用关系的题目,求解的过程就是判断list1和list2两个头结点哪个小,然后把小的作为合成链表的下一个元素,然后再把它后面的节点做一次递归。递归+建立引用关系:递归:递归体现在拿小的那个节点的下一个节点,作为新的头结点参与递归。建立引用关系:把选出的那个val值...原创 2019-02-25 20:22:23 · 141 阅读 · 0 评论 -
剑指offer 翻转单词顺序列
题目分析我的思路是遍历原字符串,采用一个临时字符串来保存累加的值,如果遇到空格,则把之前累加的字符串存入ArrayList并把临时字符串置为空,继续后面的遍历,这里要注意别忘记加上最后一段。得到单词队列后从后往前遍历,分别取出字符串拼接并加上空格,当拼接到最后一个单词时就不需要加空格了。代码import java.util.*;public class Solution { p...原创 2019-07-21 23:43:03 · 157 阅读 · 0 评论 -
剑指offer 求1+2+3+......+n
题目描述分析**用什么替代for循环?**采用递归的方式来避免循环。如何判断递归的终点? n为从大到小递归累加,递归的终点即n = 0。用什么替代if条件判断? 使用三目运算符。代码不断递归累加,一直加到0结束。public class Solution { public int Sum_Solution(int n) { return n == 0 ? 0...原创 2019-07-21 23:16:59 · 125 阅读 · 0 评论 -
剑指offer 字符流中第一个不重复的字符
题目描述分析题目中给定的是insert方法和获取首个不重复字符的方法。我的思路是在全局设立一个ArrayList来存储插入的数据,在插入的时候不做多余操作;在获取结果的方法中,通过map来保存字符出现的频次,然后再遍历一次list,首个在map中对应值为1的字符就是需要返回的字符,如果没有找到最后就返回null。代码import java.util.*;public class Sol...原创 2019-07-20 15:31:34 · 160 阅读 · 0 评论 -
剑指offer 删除链表中的重复节点
题目描述分析一开始陷入了一个误区,上述的链表被我处理为了12345,只是去掉了重复的第二个元素,而题目要求是重复的节点都要去掉。那么简单的递归就不能解决问题了。首先,需要知道某个节点在全局出现了几次,再去连接。那么解决此题的第一步就是遍历链表,通过map记录节点的出现的频次。然后再从第一个节点开始进行连接。遍历节点统计频次:HashMap<Integer,Integer> m...原创 2019-07-20 14:58:57 · 205 阅读 · 0 评论 -
剑指offer 序列化二叉树
题目描述分析题目并不复杂,关键是理解它并建立思路。序列化和反序列化无非是把对象转化为字符串形式存储和把字符串还原为对象这两个过程。看到序列化会想到遍历,二叉树;目标是字符串,那么就可以使用字符串拼接的方式。那么是否可以采用递归呢?可以的,在序列化的过程中,子节点和父节点具有相同的规律。在实现上,序列化时采用递归,对子树递归并把子树返回的字符串拼接在当前字符串后,最终返回总的字符串;反序列化时...原创 2019-07-20 11:21:06 · 143 阅读 · 0 评论 -
剑指offer 机器人的运动范围
题目描述分析思路:题目中给出的条件告诉我们机器人可以到某个点的条件是横纵坐标的各个位数之和小于k。相当于告诉了我们某个点的判断方法。题目要求是求得机器人能够到达多少个格子,也就是说需要我们推得它可以去哪些点,我能想到的就是根据它当前可以到达的点向其四周寻找可以前行的点,然后再以新的点去向四周开始新的搜索,最终所能到达的点的总和就是所求格子数。如何去重?初始化一个二维数组,类型为布尔值...原创 2019-07-19 13:46:10 · 147 阅读 · 0 评论 -
剑指offer 字符串的排列
题目分析**递归:**获取字符串的所有排列,最初想到的是for循环的嵌套,但其实字符串的长度未知,这种方法是不可行的。未知循环次数则应该采用递归,递归可以根据输入灵活嵌套。字典序: 运用集合Collection的sort方法对list在返回前处理一下即可。如何用递归来获取全排列? 以往循环的方式是在i一定时改变j,这里也是类似的思路,第一个位置有若干种情况,遍历整个字符串把不重复的字符替...原创 2019-07-14 20:34:18 · 124 阅读 · 0 评论 -
剑指offer 二叉搜索树与双向链表
题目描述题解二叉搜索树转双向链表。采用递归的思路去求解,当前节点左侧的节点都小于它,只要采用递归的方式去实现就可以了,当前节点的父节点和右子节点都大于它,但是在建立连接的时候应先连接右子节点,再把生成的链表反馈给上一层。这里直接给出代码,然后分析思想:public class Solution { private TreeNode leftHead = null; ...原创 2019-07-14 19:00:29 · 183 阅读 · 0 评论 -
剑指offer 二叉树中和为某一值的路径
题目描述分析题目的意思是找到根节点到叶节点的路径中的节点值之和等于目标值的路径,比较直接的方式是通过target和root来递归,每向下传递一级就把target减去当前节点的值,当监测到根节点且target为0时,就可以保存该路径。具体步骤见如下分解分析:两个队列来保存结果,其中一个用来保存找到的结果路径,另一个用来保存临时累加的路径。这两个队列作为全局。ArrayList<Arr...原创 2019-07-14 18:16:26 · 147 阅读 · 0 评论 -
剑指offer 二叉搜索树的后序遍历
题目描述分析这题的关键是对树进行划分,明确后序遍历的特点,后序遍历的结果得到的序列一般是左子树的序列+右子树的序列+当前节点,它们之间存在大小关系,左子树小于根节点,右子树大于根节点。判断是否为后序遍历结果需要使用递归判断,因此这里加一个方法,参数需要包括原序列和起始点及终止点。根据输入,先找到从左至右第一个大于根节点(序列的最后一个值)的数的位置,然后保存这个位置令某个指针右移,如果途经的...原创 2019-07-14 16:33:02 · 104 阅读 · 0 评论 -
剑指offer 从上往下打印二叉树 | 把二叉树打印成多行 | 按之字形顺序打印二叉树
题目分析题目很简短,需要我们自上而下,自左至右打印数据,这个“打印”我们可以理解为在列表中按照这个顺序添加参数。原本想到的是递归的方法,但是它不能做到这种按层的打印,必定会沿着子树不断递归。按层打印的效果的实现可以通过队列,先入队当前节点的左右节点,然后把当前节点的值打印,再出队左子节点,对左子节点的子节点进行入队,然后再出队右子节点,它的子节点入队。这样这一层已经按照顺序打印,下一层也已经...原创 2019-07-14 15:43:31 · 191 阅读 · 0 评论 -
剑指offer 栈的压入、弹出序列
题目分析这题需要我们通过两个数组,模拟出一个入栈和出栈的过程。第一个数组告诉了我们入栈的顺序,第二个数组告诉了我们出栈的顺序,我们需要证明这种方式是否可行。此题需要一个辅助栈。过程:先压入数组的第一个元素,然后去和弹栈序列的第一个值比对,相等则说明这个值需要弹出,那么就把它pop,然后弹栈序列的指针指向下一个值,如果不满足条件,可以继续压栈,直到满足出栈条件。最终判断是否合理,只要看辅助栈...原创 2019-07-14 14:52:48 · 183 阅读 · 0 评论 -
剑指offer 顺时针打印矩阵
分析这题重点需要考虑到两个地方:第一,需要把打印的行为变为一种循环,找到每次必定执行的规律;第二,确定循环的次数。如何确定圈数?取矩形较短的那条边的长度,它对圈数的影响最大,比如44矩形,对应两圈,22矩形,对应一圈,33矩形,对应两圈,我们可以找到规律圈数等于较短的边长(n-1)/2+1。如何思考四个for循环?以一个特殊的例子来思考,比如44矩形的第二圈,此时i为1。判断参数的边界值和...原创 2019-07-14 14:05:24 · 111 阅读 · 0 评论 -
剑指offer 树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)递归root1节点:如果当前的root1对应的树和root2对应的树相等,那么就直接可以返回true,如果不相等,再分别拿root1的左子树和root1的右子树去和root2进行比对,递归判断。public boolean HasSubtree(TreeNode root1,TreeNode...原创 2019-02-25 21:06:23 · 192 阅读 · 0 评论 -
剑指offer 和为S的两个数字
题目描述分析思路: 通过map来降低算法的时间复杂度为O(1),在遍历的过程中结合map来判断是否有满足和为S的值,如果找到了则根据乘积判断是否需要更新结果。map保存数据: HashMap<Integer,Integer> map = new HashMap(); for(int a : array) { map.put...原创 2019-07-22 00:21:44 · 145 阅读 · 0 评论