剑指offer
LUK流
大数据/java web
展开
-
(25)复杂链表的复制
1.问题输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2. 思路(1)先将原来的链表复制一份,具体赋值方式如下:(2)根据原来的节点的random确定复制节点的random(3)最后将蓝色的节点和绿色的节点分开3.代...原创 2019-11-17 17:01:10 · 108 阅读 · 0 评论 -
(24)二叉中和为某一个值的路径
1. 题目输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)2.思路由题目中的“数组长度大的数组靠前”可知,需要使用dfs3.代码/** * 问题:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 *...原创 2019-11-17 16:16:00 · 163 阅读 · 0 评论 -
(23)二叉搜索树的后序遍历序列
1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2.思路每一轮递归实现的功能:然后遍历蓝色的左子树和绿色的右子树。3.代码/** * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 *...原创 2019-11-17 16:04:08 · 102 阅读 · 0 评论 -
(22)从上往下打印二叉树
1. 题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。2.思路分为两步:(1)将根节点加入队列(2)循环出队:如图1节点出队。变成红色,出队时判断该节点是否有左子树和右子树。如果有左子树和右子树就将左子树和右子树加入到队列中。然后循环从头结点开始出队。3. 代码/** * 题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 */public cl...原创 2019-11-12 13:54:10 · 154 阅读 · 0 评论 -
(21)站的压入、弹出顺序
1. 题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2. 思路以int pushA[] = {1,2,3,4,5};和int popA...原创 2019-11-09 22:05:43 · 136 阅读 · 1 评论 -
(20)包含min函数的栈
1.问题定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。2.思路这个题目要解决的是,每次从stack里面删除一个数据,如何o(1)的时间复杂度输出一个最小值。如下图,从左边变成右边以o(1)的时间复杂度输出最小值。采用两个stack,如图,左边的stack用于数据处理,右边的stack用于备份左边的stack的最小值的版本。当左边的s...原创 2019-11-08 17:54:08 · 132 阅读 · 0 评论 -
(19)顺时针打印矩阵
1. 题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.2.思路如下图所示,每次遍历,(1)如果是第一层就像红色的线的路径一样,并记录此时layer-0来标示着是第一层...原创 2019-11-08 14:50:27 · 90 阅读 · 0 评论 -
(18)二叉树的镜像
1. 题目操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 52. 思路对于每个...原创 2019-11-07 20:51:46 · 82 阅读 · 0 评论 -
(17)树的子结构
1.题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2.思路先写一个函数isIncludeTree(TreeNode root1, TreeNode root2)判断以root1和root2两个根节点为起点,root1是否包含root2,如下图,右边的图包含左边的图然后写一个函数遍历右边的树每个节点,如下:(1)比较两个绿色的8,查看是右边...原创 2019-11-07 15:01:28 · 99 阅读 · 0 评论 -
(16)合并两个排序的链表
1. 题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2. 思路每次选举出两个链表较小的头节点,插入新链表的尾部3. 代码/** * 题目:输入两个单调递增的链表,输出两个链表合成后的链表, * 当然我们需要合成后的链表满足单调不减规则。 */public class Test16 { public static void...原创 2019-11-05 13:08:45 · 94 阅读 · 0 评论 -
(15)反转链表
1. 题目输入一个链表,反转链表后,输出新链表的表头。2. 思路重复下面的过程:3.代码/** * 题目:输入一个链表,反转链表后,输出新链表的表头。 */public class Test15 { public static void main(String[] args) { ListNode node = new ListNode(10); ...原创 2019-11-05 12:58:20 · 92 阅读 · 0 评论 -
(14)链表倒数第k个节点
1. 题目输入一个链表,输出该链表中倒数第k个结点。2. 思路使用快慢指针,一个指针比另一个指针快k步,当其到末尾时,最后一个数恰好到达了倒数第k步3. 代码/** * 题目:输入一个链表,输出该链表中倒数第k个结点。 */public class Test14 { public static void main(String[] args) { } p...原创 2019-11-05 12:48:01 · 75 阅读 · 0 评论 -
(13)调整数组使奇数位于偶数前
1. 题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2.思路将所有的奇数放入一个数组,偶数放入一个数组,再将偶数数组加到奇数数组上。3.代码/* * @author qianliu on 2019/4/22 10:50 * @Discription: * 1...原创 2019-11-05 11:01:33 · 112 阅读 · 0 评论 -
(12)数值的整数次方
1.题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为02.思路如果是exponent大于0,那么就是exponent个base相乘,如果exponent小于0就再次取倒数。3.代码/* * @author qianliu on 2019/4/21 19:26 * @Discrip...原创 2019-11-05 10:40:32 · 109 阅读 · 0 评论 -
(11)二进制中1的个数
1.问题输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2. 思路方法一:n乘以n-1会把n的二进制最右边的第一个1变成0方法二:n的最后一个位 & 1,如果是1就是就说明最后一位是13.代码/* * @author qianliu on 2019/4/21 15:47 * @Discription: * 1.问题: * 输入一个整数,输出该数二进制表示...原创 2019-11-05 10:29:14 · 292 阅读 · 0 评论 -
(10)矩形覆盖
1.问题我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?2.思路当target = n上图中,如果填充第一个2n(绿色)的如图所示,那么就变成了RectCover(n-1)问题下图中,如果填充第一个2n(绿色)的如图所示,那么第二块砖必定是蓝色的砖块,问题变成了RectCover(n-2)问题.3.代码pa...原创 2019-04-21 15:37:08 · 133 阅读 · 0 评论 -
(9)变态跳台阶
1.问题一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2.思路1.JumpFloorII(0)=12.JumpFloorII(1)=13.JumpFloorII(2)=JumpFloorII(0)+JumpFloorII(1)4.JumpFloorII(n)=JumpFloorII(0)+JumpFloorII(1)+Ju...原创 2019-04-21 12:45:42 · 102 阅读 · 0 评论 -
(8)跳台阶
1.问题一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。2.思路1:第一个阶台阶:return JumpFloor(0)表示从第0阶台阶跳上来2.第二阶台阶:return JumpFloor(0)+JumpFloor(1)表示从第0阶台阶跳上了和第一阶台阶跳上来3.第n阶台阶:return JumpFloor(targ...原创 2019-04-21 12:39:51 · 111 阅读 · 0 评论 -
(7)斐波那契数列
1.问题大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=392.思路当前的数据等于前两个数据值和。即return Fibonacci(n-1) + Fibonacci(n-2)即可3.代码package test1_10;/* * @author qianliu on 2019/4/10 14:27 * @Disc...原创 2019-04-20 21:02:22 · 290 阅读 · 0 评论 -
(6)旋转数组最小数字
1.问题把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.思路因为所有的数据有类似345122这样的数据规则,最小值1前面的数据部分大于后面的所有数据使用二分法,...原创 2019-04-20 20:59:26 · 260 阅读 · 0 评论 -
(5)两个栈实现队列
1.问题用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。2.思路(1)加入的数据都放入stack1中(2)取数据时,如果stack2中有数据就直接stack2.pop()取走数据,如果stack2中没有数据,就将stack1中的数据全部加入到stack2中以后再从stack2中取数据。3.代码package test1_10;import ja...原创 2019-04-08 15:10:28 · 147 阅读 · 0 评论 -
(4)重新二叉树
1.题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2.思路(1)由先序可知,当前第一个元素A的是当前前子树的根节点(2)从中序查找A,A前面的元素都是当前的左子树,A右边的元素都是右子树3.代码...原创 2019-04-08 14:18:26 · 98 阅读 · 0 评论 -
(3)从尾到头打印链表
1.题目输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。2.思路遍历链表放入到一个arraylist.然后反转arraylist3.代码package test1_10;import java.util.ArrayList;import java.util.Collections;public class test3 { public static vo...原创 2019-04-01 15:41:03 · 97 阅读 · 0 评论 -
(2)替换空格
1.题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2.思路正则表达式进行字符串的替换3.代码package test1_10;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * @...原创 2019-04-01 15:37:03 · 92 阅读 · 0 评论 -
(1)二维数组的查找
1.题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.思路1.对第一列的数据遍历,发现index的数据小于target,index+1行的数据小于target,那么在index从头到尾查找数据2.否则从第二列开始查找对应的index行…n...原创 2019-04-01 15:33:05 · 118 阅读 · 0 评论