![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
🗡指offer
刷题!看思想
骓不逝兮
如果不努力,你还能干嘛
展开
-
不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例1输入1,2返回值3理解:首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位.原创 2021-03-26 10:43:31 · 117 阅读 · 0 评论 -
2021-03-26
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。示例1输入7返回值8理解!!!import java.util.*;public class Solution { public int GetUglyNumber_Solution(int index) { if(index<=0) return.原创 2021-03-26 10:05:01 · 59 阅读 · 0 评论 -
跳台阶扩展问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。f(n-1) = f(0) + f(1) + f(2) + ... + f(n-2) + f(n-1)f(n) = f(0) + f(1) + f(2) + ... + f(n-2) + f(n-1) + f(n)两式相减得,f(n) = f(n-1) * 2 ;public class Solution { public int jumpFloorII(int ...原创 2021-03-22 20:17:54 · 315 阅读 · 1 评论 -
2021-03-22
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:递归:当 target = 0 , 结果为 1 ; 当 target = 1,结果为 1 ; 当 target = 2,结果为 2;后面 递归:第一个长方形有两种方法,竖着放, 剩下的长方形 有 rectCover(target - 1) 种放法;横着放,则 第二个长方形也只能横着放,剩下的长方...原创 2021-03-22 19:45:32 · 69 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。import java.util.PriorityQueue;import java.util.Comparator;public class Solution { //小顶堆 p..原创 2021-03-20 21:05:37 · 64 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后.原创 2021-03-19 20:33:45 · 97 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入{10,5,12,4,7},22返回值[[10,5,7],[10,12]]示例2输入{10,5,12,4,7},15返回值[]import java.util.ArrayList;/**public class TreeNode { int val = 0..原创 2021-03-18 21:35:25 · 63 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val..原创 2021-03-17 20:51:09 · 53 阅读 · 0 评论 -
2021-03-17二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)示例1输入[4,8,6,12,16,14,10]返回值true递归:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后.原创 2021-03-17 20:36:25 · 65 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入{8,6,6,5,7,7,5}返回值true示例2输入{8,6,9,5,7,7,5}返回值false思路:对称的二叉树,有三种对称是必须的1、根节点,左右子节点,相等2、根节点的左子树的右子树,与右子树的左子树相同3、根节点的左子树的左子树,与右子树的右子树相同/*public class Tree...原创 2021-03-14 13:42:46 · 65 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入{5,4,#,3,#,2,#,1}返回值[5,4,3,2,1]思路:使用队列进行层次遍历import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/**public class TreeNode { int val = 0; TreeNode left = null; .原创 2021-03-14 12:47:17 · 50 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。示例1输入{8,6,10,5,7,9,11}返回值[[8],[6,10],[5,7,9,11]]递归:使用队列结构, 进行层次遍历import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/*public class TreeNode { int val = 0; T..原创 2021-03-14 12:18:13 · 60 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。递归:中序遍历,左中右分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.节点为根节点,右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点 (D->N);3.节点不是根节点, 如果该节点是其父节点的左孩子,则返回父节点,(I->E); 否...原创 2021-03-13 20:57:38 · 157 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例1输入[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值{1,2,5,3,4,6,7}递归法:/** * Definition for binary tree * public class Tr..原创 2021-03-13 20:26:41 · 65 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例1输入{1,2,3,4,5,6,7}返回值true方法一:递归public class Solution { public boolean IsBalanced_Soluti.原创 2021-03-12 20:44:37 · 54 阅读 · 0 评论 -
二叉搜素树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入{5,3,7,2,4,6,8},3返回值{4}说明按结点数值大小顺序第三小结点的值为4 方法一:借助 ArrayList, 先序遍历搜索树,得到递增的数列/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public..原创 2021-03-12 20:30:42 · 73 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例1输入{1,2,3,4,5,#,6,#,#,7}返回值4方法一:递归(先序遍历)/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {.原创 2021-03-11 19:48:10 · 96 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5示例1输入{8,6,10,5,7,9,11}返...原创 2021-03-11 19:31:56 · 60 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)/**解题思路:*1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;*2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;*3、拆分链表,将链表拆分为原链表和复制后的..原创 2021-03-10 11:34:12 · 55 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。方法一:使用 HashMap 的特性import java.util.HashMap;class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}public class Solution { public ListNode ..原创 2021-03-10 10:51:57 · 78 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的方法一:找出两个链表的长度差 r,长的链表先走 r 步,之后两个链表同步向后查找。import java.util.HashMap;class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }..原创 2021-03-10 09:55:05 · 48 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入{1,2,3,3,4,4,5}返回值{1,2,5}class ListNode { int val; ListNode next = null; ListNode(int val) { this.原创 2021-03-09 17:53:44 · 51 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入{67,0,24,58}返回值[58,24,0,67]方法一:使用库函数/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }.原创 2021-03-09 17:14:32 · 45 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配示例1输入"aaa","a*a"返回值true思路:递归import java.util.*;public class Solution { /**..原创 2021-03-09 16:30:38 · 71 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。示例1输入"ab"返回值["ab","ba"]方法:回溯法(递归)思路:固定第一个字符,递归取得首位后面的各种字符串组合;再把第一个字符与后面每一个字符交换,并同样递归获得首位后面的字符串组..原创 2021-03-08 20:37:39 · 87 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.示例1输入[[1,2],[3,4]]返回值[1,2,4,3]思路:打印一圈有四个方向:y++,x++,y--,x--当第一圈开始第四个方向时,offset 会加 1,初始的 offset 为 0.原创 2021-03-08 11:26:37 · 101 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。示例1输入[1,2,3,2,2,2,5,4,2]返回值2方法一:分治算法 O(n)实例:芯片检测思想:当两个芯片不同,都丢弃;当两个芯片相同,留下一个。多次操作后,当剩下一个,则为好芯片,若剩下两个,这两个都是好芯片。转化:在遍历数组的过程中,保.原创 2021-03-08 11:25:56 · 152 阅读 · 0 评论 -
和为s的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。返回值描述:对应每个测试案例,输出两个数,小的先输出。输入[1,2,4,7,11,15],15返回值[4,11]思路:两个指针,分别执行数组的首部和尾部。步骤一:首指针不动,尾指针向前移动:当首尾和为 s 则记录下来;若和大于 s 则尾指针向前移动;若和小于 s 则下一步;步骤二:首指针向后移动一位,回到步骤一;终...原创 2021-03-08 11:23:21 · 52 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是第一个重复的数字2。没有重复的数字返回-1。示例1输入[2,3,1,0,2,5,3]返回值2思路:方法一: 使用 set 的特性import java.util.*;public class Solutio...原创 2021-03-08 11:22:48 · 70 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!输入"abcXYZdef",3返回值"XYZdefabc"方法一:字符反转,对于字符串 abcABC 令 n = 3, 结果为 ABCabc可以采取的操作为:字段一为 abc...原创 2021-03-08 11:22:14 · 116 阅读 · 0 评论 -
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。示例1输入"123.45e+6"返回值true示例2输入"1.2.3"返回值false字符串匹配import java.util.*;public class Solution {..原创 2021-03-08 11:21:10 · 57 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入[1,2,3,4]返回值[1,3,2,4]方法一:使用冒泡排序(稳定性) public int[] reOrderArray (int[] array) { // bubble sort if (array == null || array.lengt.原创 2021-03-08 11:26:54 · 84 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例1输入7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值true方法:从左下角开始查找,左下角数的特点:向上的数比他小,向右的数比他大当查询数比当前数小,就向上查找;当查询数比当前数大,就向右查找。publi..原创 2021-03-06 16:50:30 · 58 阅读 · 0 评论 -
逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007对于50\%50%的数据,size\leq 10^4size≤104对于75\%75%的数据,size\leq 10^5size≤105对于100\%100%的数据,size\leq 2*10^5size≤2∗105输入[1,2,3,4,5,6,7,0]返回7.原创 2021-03-02 20:25:59 · 73 阅读 · 0 评论