剑指offer(第二版)-Java实现
根据自己的做题心得,同时整合了多个版本的题解,使用Java语言实现,自认为是比较简单且容易理解的解法,希望可以给大家带来帮助。
贼猫z
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指offer(Java实现)3 - 数组中的重复数字
找出数组中重复的数字-3-1给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回...原创 2019-08-11 17:30:36 · 245 阅读 · 0 评论 -
剑指offer(Java实现)4 - 二维数组中的查找
二维数组中的查找-4在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例输入数组:[ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15]]如果输入查找数值为7,则返回true,如果输入查找数值为5,则返...原创 2019-08-12 15:50:29 · 119 阅读 · 0 评论 -
剑指offer(Java实现)5 - 替换空格
替换空格-5请实现一个函数,把字符串中的每个空格替换成"%20"。你可以假定输入字符串的长度最大是1000。注意输出字符串的长度可能大于1000。样例输入:"We are happy."输出:"We%20are%20happy."思路:先计算出需要的总长度,然后从后往前进行复制和替换,则每个字符只需要复制一次即可。时间效率为O(n)public class Solution5...原创 2019-08-12 15:52:38 · 137 阅读 · 0 评论 -
剑指offer(Java实现)6 - 从尾到头打印链表
从尾到头打印链表-6输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回的结果用数组存储。样例输入:[2, 3, 5]返回:[5, 3, 2]思路:可以有多种方法实现class Soultion{ /** * 使用堆栈的方法实现 */ public static void printListReverseByStack(ListNode h...原创 2019-08-12 15:54:48 · 176 阅读 · 0 评论 -
剑指offer(Java实现)7 - 重建二叉树
重建二叉树-7输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同;输入的前序遍历和中序遍历一定合法;样例给定:前序遍历是:[3, 9, 20, 15, 7]中序遍历是:[9, 3, 15, 20, 7]返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]返回的二叉树如下所...原创 2019-08-12 15:58:58 · 164 阅读 · 0 评论 -
剑指offer(Java实现)8 - 二叉树的下一个节点
二叉树的下一个节点-8给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;样例假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。解释:该二叉树的结构如下,2的后继节点是3。 ...原创 2019-08-12 16:01:36 · 140 阅读 · 0 评论 -
剑指offer(Java实现)9 - 用栈实现队列
用栈实现队列-9-1请用栈实现一个队列,支持如下四种操作:push(x) – 将元素x插到队尾;pop() – 将队首的元素弹出,并返回该元素;peek() – 返回队首元素;empty() – 返回队列是否为空;注意:你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;如果你选择的编程语言没有栈的标准库,你可...原创 2019-08-12 16:05:02 · 197 阅读 · 0 评论 -
剑指offer(Java实现)9 - 用队列实现栈
用队列实现栈-9-2使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用...原创 2019-08-12 16:06:36 · 186 阅读 · 0 评论 -
剑指offer(Java实现)10 - 斐波那契数列
斐波那契数列-10输入一个整数 n ,求斐波那契数列的第 n 项。假定从 0 开始,第 0 项为 0。(n <= 39)样例输入整数 n=5 返回 5**思路:**多种方法public class Solution { // 递归 public static int fabonacci(int n) { if (n <= 0) ...原创 2019-08-12 16:08:05 · 191 阅读 · 0 评论 -
剑指offer(Java实现)11 - 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例输入:nums=[2,2,2,0,1]输出:0**思路:**二分查找左边界class Solut...原创 2019-08-12 16:13:23 · 126 阅读 · 0 评论 -
剑指offer(Java实现)12 - 矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空;所有出现的字符均为大写英文字母;样例matrix=[ ["A","B","C","E"], ["S","F","C"...原创 2019-08-12 16:14:27 · 193 阅读 · 0 评论 -
剑指offer(Java实现)13 - 机器人的运动范围
机器人的运动范围-13地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0 ~ m−1 和 0 ~ n−1。一个机器人从坐标(0,0)的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 k 的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40...原创 2019-08-13 08:47:41 · 160 阅读 · 0 评论 -
剑指offer(Java实现)14 - 剪绳子
剪绳子-14给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2 ≤ n ≤ 58 并且 m ≥ 2)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少?例如当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到最大的乘积 18。样例输入:8输出:18**思路1:**动态规划使用动态...原创 2019-08-13 08:48:30 · 205 阅读 · 0 评论 -
剑指offer(Java实现)15 - 二进制中'1'的个数
二进制中‘1’的个数-15输入一个32位整数,输出该数二进制表示中1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9输出:2解释:9 的二进制表示是1001,一共有2个1。样例2输入:-2输出:31解释:-2在计算机里会被表示成11111111111111111111111111111110,一共有31个1。思路:public class Sol...原创 2019-08-13 08:49:28 · 223 阅读 · 0 评论 -
剑指offer(Java实现)16 - 数值的整数次方
数值的整数次方-16实现函数 double Power(double base, int exponent),求base的 exponent次方。不得使用库函数,同时不需要考虑大数问题。注意:不会出现底数和指数同为0的情况样例1输入:10 ,2输出:100样例2输入:10 ,-2 输出:0.01**思路:**快速幂1.需要注意以下陷阱 1)0的负数次方不存在;...原创 2019-08-13 08:51:02 · 207 阅读 · 0 评论 -
剑指offer(Java实现)17 - 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 最大的 n 位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即 999。思路:考虑大数问题,使用字符串代替数字。class Solution{ public void print1ToMaxOfNDights1s(int n) { if (n <= 0) return; char[]...原创 2019-08-13 08:51:57 · 244 阅读 · 0 评论 -
剑指offer(Java实现)18 - 在O(1)时间删除链表节点
在O(1)时间删除链表节点-18-1给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。样例输入:链表 1->4->6->8删掉节点:第2个节点即6(头节点为第0个节点)输出:新链表 1->4->8思路:public class Solution018 { /** * 在O(...原创 2019-08-13 08:53:28 · 159 阅读 · 0 评论 -
剑指offer(Java实现)18 - 删除链表中的重复节点
删除链表中的重复节点-18-2删除链表中的重复节点,重复的只保留一个。输入: 1->1->2->3->3输出: 1->2->3思路:public ListNode deleteDuplicates(ListNode head) { ListNode current = head; while (current != null &...原创 2019-08-13 08:54:45 · 309 阅读 · 0 评论 -
剑指offer(Java实现)19 - 正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。样例输入:s="aa"p="a*"输出:true思路:递归判断多种情况。如果模式串...原创 2019-08-13 08:57:44 · 194 阅读 · 0 评论 -
剑指offer(Java实现)20 - 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。注意:小数可以没有整数部分,例如.123等于0.123;小数点后面可以没有数字,例如233.等于233.0;小数点前面和后面可以有数字,例如...原创 2019-08-13 08:59:05 · 207 阅读 · 0 评论 -
剑指offer(Java实现)21 - 调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面-21输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]思路:双指针法,遍历一次,不符合条件就进行交换。class Solution{ public void reOrderArray(int[] array) { ...原创 2019-08-13 09:00:11 · 247 阅读 · 0 评论 -
剑指offer(Java实现)22 - 链表中的倒数第K个节点
链表中的倒数第K个节点-22输入一个链表,输出该链表中倒数第k个结点。注意:k >= 0;如果k大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4思路:快慢指针,快指针先走 n-1 步,然后两个指针一起走,快指针到达链表尾时,满指针就是要求的节点。class Solution{ public sta...原创 2019-08-14 11:46:28 · 151 阅读 · 0 评论 -
剑指offer(Java实现)23 - 链表中环的入口节点
链表中环的入口节点-23给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.思路:阶段 1:这里我们初始化两个指针 - 快指针和慢指针。我们每次移动慢指针一步、快指针两...原创 2019-08-14 11:47:58 · 218 阅读 · 0 评论 -
剑指offer(Java实现)24 - 反转链表
反转链表-24定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL思路:迭代:使用三个指针(pre,p,next)进行实现。令p指向pre,next则是用于防止链表断裂(很简单,详见代码)。class Solut...原创 2019-08-14 11:49:45 · 139 阅读 · 0 评论 -
剑指offer(Java实现)25 - 合并两个排序链表
合并两个排序链表-25输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5思路:迭代:class Solution { public ListNode mergeTwoLists(ListNode l1, List...原创 2019-08-14 11:50:57 · 105 阅读 · 0 评论 -
剑指offer(Java实现)26 - 树的子结构
树的子结构-26输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例树A: 8 / \ 8 7 / \ 9 2 / \ 4 7树B: 8 / \ 9 2返回 true ,因为B是A的子结构。思路:先判断A树从根节点开始子结构是否含有B树,再分别判断A左子树和右子树。class...原创 2019-08-14 11:55:02 · 163 阅读 · 0 评论 -
剑指offer(Java实现)27 - 二叉树的镜像
二叉树的镜像-27输入一个二叉树,将它变换为它的镜像。样例输入树: 8 / \ 6 10 / \ / \ 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / \ 10 6 / \ / \ 11 9 7 ...原创 2019-08-14 11:56:41 · 199 阅读 · 0 评论 -
剑指offer(Java实现)28 - 对称的二叉树
对称的二叉树-28请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树: 1 / \ 2 2 / \ / \3 4 4 3如下图所示二叉树[1,2,2,null,4,4,3,...原创 2019-08-14 11:58:14 · 162 阅读 · 0 评论 -
剑指offer(Java实现)29 - 顺时针打印矩阵
顺时针打印矩阵-29输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]思路:模拟打印过程class Solution{ public int[] printMatrix(int[][] matri...原创 2019-08-14 11:59:14 · 166 阅读 · 0 评论 -
剑指offer(Java实现)30 - 包含min函数的栈
包含min函数的栈-30设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);min...原创 2019-08-14 12:00:06 · 139 阅读 · 0 评论 -
剑指offer(Java实现)31 - 栈的压入弹出序列
栈的压入弹出序列-31输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹...原创 2019-08-14 12:01:05 · 124 阅读 · 0 评论 -
剑指offer(Java实现)32 - 从上到下打印二叉树
从上到下打印二叉树-32-1从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[8, 12, 2, 6, 4]思路:非递归:class Solu...原创 2019-08-14 12:02:35 · 167 阅读 · 0 评论 -
剑指offer(Java实现)32 - 分行从上到下打印二叉树
分行从上到下打印二叉树-32-2从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[[8], [12, 2], [6], [4]]思路:非递...原创 2019-08-15 12:02:32 · 222 阅读 · 0 评论 -
剑指offer(Java实现)32 - 之字形打印二叉树
之字形打印二叉树-32-3请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / \ 12 2 / \ 6 4...原创 2019-08-15 12:04:04 · 140 阅读 · 0 评论 -
剑指offer(Java实现)33 - 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列-33输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。样例输入:[4, 8, 6, 12, 16, 14, 10]输出:true思路:后序序列最后一个值为root,二叉搜索树左子树值都比root小,右子树值都比root大1、确定root2、遍历序列(除去r...原创 2019-08-15 12:04:35 · 147 阅读 · 0 评论 -
剑指offer(Java实现)34 - 二叉树中和为某一值的路径
二叉树中和为某一值的路径-34输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。样例给出二叉树如下所示,并给出num=22。 5 / \ 4 6 / / \ 12 13 6 / \ / \9 1 5 1输出:[[5,4,12,1],...原创 2019-08-15 12:05:08 · 188 阅读 · 0 评论 -
剑指offer(Java实现)35 - 复杂链表的复制
复杂链表的复制-35请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。思路:分成三步public class Solution { public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) r...原创 2019-08-15 12:06:07 · 124 阅读 · 0 评论 -
剑指offer(Java实现)36 - 二叉搜索树与双向链表
二叉搜索树与双向链表-36输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。思路:非递归:使用中序遍历class Solution { public TreeNode convert(TreeNode root...原创 2019-08-15 12:07:31 · 147 阅读 · 0 评论 -
剑指offer(Java实现)37 - 序列化二叉树
序列化二叉树-37请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"思路:非递归:cl...原创 2019-08-15 12:08:04 · 158 阅读 · 0 评论 -
剑指offer(Java实现)38 - 数字排列
数字排列-38-1输入一组数字,输出其所有的排列方式。样例输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]思路:回溯法class Solution { L...原创 2019-08-15 12:09:13 · 197 阅读 · 0 评论
分享