剑指Offer题解
《剑指Offer》刷题
小游子YKY
宽和慈善,不忤于物,进退沉浮,自得而已。
展开
-
【剑指Offer题解:java】汇总目录(持续更新中)
1、【剑指Offer题解:java】从尾到头打印链表2、【剑指Offer题解:java】字符串转为整数3、【剑指Offer题解:java】反转链表4、【剑指Offer题解:java】复杂链表的复制5、【剑指Offer题解:java】二维数组中的查找6、【剑指Offer题解:java】替换空格7、【剑指Offer题解:java】旋转数组的最小数字8、【剑指Offer题解:java】斐波阿契数列9、【剑指Offer题解:java】跳台阶10、【剑指Offer题解:java】矩形覆盖…持续更新原创 2021-01-23 23:53:38 · 1656 阅读 · 0 评论 -
【剑指Offer题解:java】二叉搜索树的后序遍历
文章目录题目分析代码题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。分析直接利用二叉树后序遍历的数组的最后一个数是该树的根节点的性质,将树划分成左右两个数组,两个数组必须满足【左边数据小于根节点,右边数组大于跟节点】。代码 /** * 递归法: * 二叉搜索树它的根结点总是对应该子树的后序序列的最后一个数 * 那么,只需要不断地确定出左子树区间和右子树区间原创 2021-02-06 13:30:02 · 1468 阅读 · 1 评论 -
【剑指Offer题解:java】从上往下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析初始化:一个队列Queue queue , 将root节点入队列queue如果队列不空,做如下操作:弹出队列头,保存为node,将node的左右非空子节点加入队列做2,3步骤,直到队列为空代码import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class Solution { public原创 2021-02-05 14:42:21 · 798 阅读 · 4 评论 -
【剑指Offer题解:java】重建二叉树
文章目录题目分析代码题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析根据中序遍历和前序遍历可以确定二叉树,具体过程为:根据前序序列第一个结点确定根结点根据根结点在中序序列中的位置分割出左右两个子序列对左子树和右子树分别递归使用同样的方法继续分解例如:前序序列{1,2,4,7,3,5,6,8}原创 2021-02-04 12:46:30 · 1076 阅读 · 6 评论 -
【剑指Offer题解:java】二叉树的镜像
文章目录题目分析代码题目操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5分析递归交换左右子树即可1、root ==原创 2021-02-03 16:26:15 · 1548 阅读 · 1 评论 -
【剑指Offer题解:java】树的子结构
文章目录题目分析代码题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析先序遍历树 A中的每个节点node1判断树A中以node1为根节点的子树是否包含树B终止条件:当节点 node2为空:说明树B已匹配完成(越过叶子节点),因此返回 true当节点 node1 为空:说明已经越过树 A叶子节点,即匹配失败,返回 false当节点 node1和 node2 的值不同:说明匹配失败,返回 false判断 A 和 B 的左子节点是否相等原创 2021-01-30 18:49:49 · 1709 阅读 · 3 评论 -
【剑指Offer题解:java】求1+2+3+...+n
题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)等差数列求和公式:代码public class Solution { public int Sum_Solution(int n) { return ((1+n)*n)/2; }}...原创 2021-01-29 11:44:39 · 610 阅读 · 0 评论 -
【剑指Offer题解:java】二叉树深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析所以结果为 max( 头结点左子树的最大深度, 头结点右子树的最大深度)+1先求height(node.left)再求height(node.right)然后取最大值Math.max(node.left == null ? 0 : height(node.left), node.right == null ? 0 : height(node.right)) + 1原创 2021-01-29 11:41:47 · 620 阅读 · 0 评论 -
【剑指Offer题解:java】调整数组使奇数位于偶数前面
文章目录题目题解一题解二题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题解一使用辅助数组第一次遍历:遇到奇数直接放入新数组第二次遍历:遇到偶数放入新数组进行数组copy/** * 方法一: * 使用辅助数组 * 第一次遍历:遇到奇数直接放入新数组 * 第二次遍历:遇到偶数放入新数组 * 进行数组copy原创 2021-01-28 11:29:34 · 1446 阅读 · 22 评论 -
【剑指Offer题解:java】顺时针打印矩阵
文章目录题目分析代码题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.分析定义四个变量分别代表矩阵的四条边:top,right,down,left向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 top++,同时判断是否和代表下边界的 down 交错向下走存入原创 2021-01-27 12:15:32 · 1607 阅读 · 2 评论 -
【剑指Offer题解:java】栈的压入、弹出序列
文章目录题目分析代码题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析初始化:用指针i指向pushV的第一个位置, 指针j指向popV的第一个位置如果pushV[i] != popV[j], 那么应该将pushV[i]放入栈中,i++否则原创 2021-01-26 21:55:45 · 424 阅读 · 0 评论 -
【剑指Offer题解:java】数值的整数次方
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题解1、使用内置函数/** * 使用内置函数 * * @param base * @param exponent * @return */ public double Power(double base, int exponent) { return Math.p原创 2021-01-25 16:22:05 · 1578 阅读 · 3 评论 -
【剑指Offer题解:java】链表中倒数第K个节点
文章目录题目思路一思路二题目输入一个链表,输出该链表中倒数第k个结点。思路一求倒数第k个,可以转换成求正数个数/** * 求倒数第k个,可以转换成求正数第多少个呢? * @param head * @param k * @return */ public CListNode FindKthToTail(CListNode head, int k) { if (head == null || k < 0) retu原创 2021-01-24 13:23:50 · 1585 阅读 · 2 评论 -
【剑指Offer题解:java】矩形覆盖
文章目录题目分析代码题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:看完题目的我一脸懵,对题目进行分析分析n = 1时,显然只有一种情况n =2时显然2种情况n=3时3种情况n = 4时5种情况从n=3到n=4,怎么来的呢?这里有2种情况:直接在n=3的情况下,再后面中添加一个竖着的。这个很显然成立,有3种情况然后横着的显然能添加到n-2的情况原创 2021-01-23 13:37:53 · 606 阅读 · 0 评论 -
【剑指Offer题解:java】跳台阶
文章目录题目分析题解1)使用递归2)动态规划3)循环求解题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析显然,由于它可以跳1级台阶或者2级台阶,所以它上一步必定在第n-1,或者第n-2级台阶,也就是说它跳上n级台阶的跳法数是跳上n-1和跳上n-2级台阶的跳法数之和。所以可以参考斐波拉契数列求解题解斐波拉契数列求解1)使用递归 /** * 使用递归 * @param target *原创 2021-01-22 11:27:02 · 422 阅读 · 0 评论 -
【剑指Offer题解:java】斐波阿契数列
文章目录题目题解1. 递归法2. 优化递归3. 优化存储4. 继续改造题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39题解1. 递归法斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)根据公式可以直接写出: /** * 方法一:只用递归处理 * * @param n * @return */原创 2021-01-21 12:59:08 · 2402 阅读 · 3 评论 -
【剑指Offer题解:java】旋转数组的最小数字
文章目录题目描述思路分析思路一思路二题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析思路一暴力,旋转后势必打破原先的升序,只要找到数组由升序变为降序的点即为最小数字public static int minNumberInRotateArray(int[] array) { if (array == null || array原创 2021-01-20 12:24:55 · 695 阅读 · 0 评论 -
【剑指Offer题解:java】替换空格
文章目录题目思路:1、解法一:用Java自带的函数str.toString().replace(" ","%20")。2、解法二:在当前字符串上进行替换。题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:1、解法一:用Java自带的函数str.toString().replace(" “,”%20")。public static String replaceSpace(Stri原创 2021-01-20 12:22:39 · 3686 阅读 · 9 评论 -
【剑指Offer题解:java】二维数组中的查找
文章目录一、题目二、思路分析一、思路一1、思路分析2、图解3、代码实现二、思路二一、题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、思路分析一、思路一1、思路分析从左下找利用该二维数组的性质:每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序改变个说法,即对于左下角的值 m,m 是该行最小的数,是该列最大的数原创 2021-01-19 12:30:25 · 808 阅读 · 0 评论 -
【剑指Offer题解:java】复杂链表的复制
文章目录一、题目二、思路三、代码一、题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)复杂链表:class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; R原创 2021-01-19 11:57:06 · 670 阅读 · 0 评论 -
【剑指Offer题解:java】从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList原创 2021-01-14 20:44:19 · 2728 阅读 · 2 评论 -
【剑指Offer题解:java】反转链表
输入一个链表,反转链表后,输出新链表的表头。思路一:新建一个头结点,遍历原链表,每遍历一个节点,就将新的节点插入到头结点的后面注意链表的保存public static ListNode ReverseList(ListNode head) { if(head == null||head.next == null)return head;//如果只有一个节点,不需要转换 ListNode tempHead = new ListNode(0);//辅助头结点 .原创 2021-01-17 11:22:10 · 2464 阅读 · 3 评论 -
【剑指Offer题解:java】字符串转为整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0原创 2021-01-16 16:37:45 · 690 阅读 · 1 评论