![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
klaus08
这个作者很懒,什么都没留下…
展开
-
JZ24 二叉树中和为某一值的路径
原题链接描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入:{10,5,12,4,7},22返回值:[[10,5,7],[10,12]]示例2输入:{10,5,12,4,7},15返回值:[]思路从根结点开始向下遍历,每经过一个结点就把 target 的值减去该结点的 val,并把该结点的 val 加进 arrayList<Integer>当中原创 2021-08-03 09:33:07 · 148 阅读 · 0 评论 -
JZ23 二叉搜索树的后序遍历序列
原题链接描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜索树)示例1输入[4,8,6,12,16,14,10]返回值:true思路就是根据二叉树后序遍历结果判断是不是 BST。结合他俩的特点:后序遍历:根节点是末位结点。BST:左子树的所有结点的值小于根结点的值,右子树所有结点的值大于根节点的值;左右子树仍然是 BST。这样就比较好解决了,在数组原创 2021-08-02 11:48:25 · 63 阅读 · 0 评论 -
JZ59 按之字形顺序打印二叉树
原题链接描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{1,2,3,#,#,4,5},该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]示例1输入:{1,2,3,#,#,4,5}返回值:[[1],[3,2],[4,5]]示例2输入:{8,6,10,5,7,9,11}返回值:[[8],[10,6],[5,7,9,11]]示例3输入:{1,2,3,4,5}返回值:[[1],[原创 2021-08-01 14:48:28 · 68 阅读 · 0 评论 -
JZ60 把二叉树打印成多行
原题链接描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。例如:给定的二叉树是{1,2,3,#,#,4,5},该二叉树多行打印层序遍历的结果是[ [1], [2,3], [4,5] ]示例1输入:{1,2,3,#,#,4,5}返回值:[[1],[2,3],[4,5]]示例2输入:{8,6,10,5,7,9,11}返回值:[[8],[6,10],[5,7,9,11]]示例3输入:{1,2,3,4,5}返回值:[[1],[2,3],[4,5]]原创 2021-07-30 09:32:47 · 47 阅读 · 0 评论 -
JZ22 从上往下打印二叉树
原题链接描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入:{5,4,#,3,#,2,#,1}返回值:[5,4,3,2,1]思路层次遍历。解答import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Queue;public class Solution { public ArrayList<Integer> PrintFromTopToBo原创 2021-07-29 23:12:50 · 115 阅读 · 1 评论 -
JZ18 二叉树的镜像
原题链接描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5示例1输入:{8,原创 2021-07-28 08:35:15 · 80 阅读 · 0 评论 -
JZ17 树的子结构
原题链接描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例输入:{8,8,#,9,#,2,#,5},{8,9,#,2}返回值:true思路从 A树(root1为根)开始和 B树(root2为根)进行匹配,root1 和 root2 的 val 相等,那么进一步深入判断他俩左右子树是否相等;如果左右不等,分别将 A 树的左右孩子和 B 树比较,直到有一方为空说明 B 树不是 A 树的子树。在 root1 和 root2 相等时,说明 A原创 2021-07-25 20:41:15 · 53 阅读 · 0 评论 -
JZ57 二叉树的下一个结点
原题链接描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。示例1输入:{8,6,10,5,7,9,11},8返回值:9示例2输入:{8,6,10,5,7,9,11},6返回值:7示例3输入:{5},5返回值:"null"说明:不存在,后台打印"null"思路给了二叉树的层次遍历,以及其中的某个结点,求中序遍历该结点的下一个结点。如果该结点是其父节点的左孩子,那中序遍历下一个原创 2021-07-24 20:31:56 · 61 阅读 · 0 评论 -
JZ36 两个链表的第一个公共结点
原题链接描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)示例1输入:{1,2,3},{4,5},{6,7}返回值:{6,7}说明:第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分,这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的 示例2输入:{1},{2,3},{}返原创 2021-07-20 10:27:15 · 48 阅读 · 0 评论 -
JZ25 复杂链表的复制
原题链接描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。示例输入:{1,2,3,4,5,3,5,#,2,#}输出:{1,2,3,4,5,3,5,#,2,#}解析原创 2021-07-20 09:55:41 · 47 阅读 · 0 评论 -
JZ16 合并两个排序的链表
原题链接描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}思路新建一个链表。对两个待合并的链表结点进行比较,总是插入两个链表中较小的那个,直到有链表为空,就把另一个链表的所有剩余结点加到新建链表的后面。解答public class Solution { public ListNode Merge(ListNode list1,ListNode list原创 2021-07-19 20:46:40 · 39 阅读 · 0 评论 -
JZ15 反转链表
原题链接描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}思路要把链表反转,就是把从第一个结点开始遍历,依次把每个结点放在当前链表中的头结点位置,保证每次处理的结点之前子的链表是已经反转了的,直到遍历完为止。作图的话就是这样。0号结点是为了便于处理新建的附加头节点,如果要把2号结点放在当前链表的头结点位置,首先要保存附加头节点后面的内容,然后让附加头结点指向2号结点,2号结点再指向刚刚保存的附加头结点后面的内容,也就是已经反转过的链表。原创 2021-07-19 10:21:18 · 56 阅读 · 0 评论 -
JZ55 链表中环的入口结点
题目描述描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可。而我们后台程序会打印这个节点示例1输入:{1,2},{3,4,5}返回值:3说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3 示例2输入:{1},{}返回值:"null"说明:没有环,返回null,后台打印"n原创 2021-07-18 22:12:23 · 85 阅读 · 0 评论 -
JZ14 链表中倒数最后k个结点
原题链接描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入:{1,2,3,4,5},1返回值:{5}##思路遍历链表变量,存在数组中,然后按序创建链表。假设链表长度为n,求k个结点组成的链表,只要返回第(n - k + 1) 个结点后面的不动就好了。双指针,创建两个结点初始化都指向链表头结点,然后让第一个向后移 k 个结点,如果移动过程中指向null,说明该链表长度小于 k 直接原创 2021-07-18 15:32:03 · 120 阅读 · 0 评论 -
JZ56 删除链表中重复的结点
原题链接描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。示例1输入:{1,2,3,3,4,4,5}返回值:{1,2,5}思路乍一看以为很简单的,但是做的过程还是遇到以下都问题:去除重复结点时会保留最后一个重复结点更新链表后没办法保存,因为只创建一个cur进行操作,最后cur指向的是null。不过都已经原创 2021-07-17 16:05:48 · 50 阅读 · 0 评论 -
JZ3 从尾到头打印链表
原题链接描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。示例1输入:{1,2,3}返回值:[3,2,1]示例2输入:{67,0,24,58}返回值:[58,24,0,67]解答暴力/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val =原创 2021-07-16 09:27:10 · 135 阅读 · 0 评论 -
JZ43 左旋转字符串
原题链接描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S,请你把其循环左移 K 位后的序列输出(保证 K 小于等于 S 的长度)。例如,字符序列S=”abcXYZdef”,要求输出循环左移 3 位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!示例输入:"abcXYZdef",3返回值:"XYZdefabc"思路又是偷懒了直接用了String(char[], int, int)的构造方原创 2021-07-15 09:02:42 · 52 阅读 · 0 评论 -
JZ44 翻转单词序列
原题链接描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?示例输入:"nowcoder. a am I"返回值:"I am a nowcoder."思路看了这哥的,好原创 2021-07-14 22:02:57 · 46 阅读 · 0 评论 -
JZ64 滑动窗口的最大值
原题链接描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,原创 2021-07-13 10:33:50 · 42 阅读 · 0 评论 -
JZ63 数据流中的中位数
原题链接描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。示例1输入:[5,2,3,4,1,6,7,0,8]返回值:"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "说明:数据流里面不断吐出的是5,2,3...,则得到的原创 2021-07-12 20:57:22 · 36 阅读 · 0 评论 -
牛客网之SQL---持续更新
SQL1 查找最晚入职员工的所有信息select * from employeesorder by hire_date desclimit 1;SQL2 查找入职员工时间排名倒数第三的员工所有信息select *from employeesorder by hire_date desclimit 2,1;SQL3 查找当前薪水详情以及部门编号dept_noselect s.*,d.dept_no from salaries s, dept_manager dwhere s.em原创 2021-07-12 11:12:15 · 146 阅读 · 0 评论 -
JZ29 最小的K个数
原题链接描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。0 <= k <= input.length <= 10000;0 <= input[i] <= 10000。示例1输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4]说明:返回最小的4个数即可,返回[1,3,2,4]也可以 示例2输入:[1], 0返回值:[]示例3输入:[0,1,原创 2021-07-12 11:11:05 · 83 阅读 · 0 评论