![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
CheDaqian
这个作者很懒,什么都没留下…
展开
-
【剑指Offer学习】【题66:机器人的运动范围】
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:回溯法:从(0,0)开始走,每成功走...原创 2019-05-29 11:37:10 · 137 阅读 · 0 评论 -
【剑指Offer学习】【题59:按之字形顺序打印二叉树】
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:利用两个栈辅助输出奇数行的栈,先存右结点,后存左结点,这样就实现了从左向右输出。偶数行的栈,先存左结点,后存右结点,这样就实现了从右向左输出。程序:import java.util.ArrayList;import java.u...原创 2019-05-25 14:46:26 · 100 阅读 · 0 评论 -
【剑指Offer学习】【题51:构建乘积数组】
题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。思路:1、求上三角;2、求下三角;3、上三角与下三角相乘。程序:public class subject51 { public static int[] multiply(int[] A) { ...原创 2019-05-21 16:53:34 · 95 阅读 · 0 评论 -
【剑指Offer学习】【题34:第一个只出现一次的字符】
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:1、创建一个新表格arr统计各字母出现的次数;2、访问并返回arr表格中只出现一次字母的坐标。程序:public class subject34 { public static int FirstNotRepea...原创 2019-05-10 19:58:18 · 152 阅读 · 0 评论 -
【剑指Offer学习】【题45:扑克牌顺子】
题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌...原创 2019-05-15 12:29:26 · 156 阅读 · 0 评论 -
【剑指Offer学习】【题44:翻转单词顺序列】
题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:1、先翻转整个字符...原创 2019-05-15 10:34:25 · 97 阅读 · 0 评论 -
【剑指Offer学习】【题43:左旋转字符串】
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:思路1:使用Java自带的substring(beginIndex, endIndex)函数...原创 2019-05-15 10:08:04 · 93 阅读 · 0 评论 -
【剑指Offer学习】【题42:和为S的两个数字】
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:1、当a+b = c时,ab<=(a+b)的平方/4,当且仅当a==b时,ab取得最大值,二者相差越远,乘积越小。2、定义两个指针start和end,分别指向数组的第一个元素和数组的第二个元...原创 2019-05-15 09:30:32 · 86 阅读 · 0 评论 -
【剑指Offer学习】【题33:丑数】
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:1、暴力循环,但运行时间过长;2、以空间换时间,提高时间效率。创建一个数组ugly,用于存储新求出来的丑数。每次存储的一个数是依次用2,3,5乘上数组中已经求出来的丑数,选出其中最小的一个。例如...原创 2019-05-10 10:26:13 · 105 阅读 · 0 评论 -
【剑指Offer学习】【题32:把数组排成最小的数】
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:1、数组中所有的数拼接后有可能会超过整数的范围,因此本题必须要使用字符串来处理;2、两个数字m和n能拼接成数字mn和数字nm,如果mn<nm那么说明m应该排在n前面,我们应该打印出mn;反之,如果n...原创 2019-05-10 09:13:53 · 95 阅读 · 0 评论 -
【剑指Offer学习】【题41:和为S的连续正数序列】
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列...原创 2019-05-14 21:05:58 · 100 阅读 · 0 评论 -
【剑指Offer学习】【题53:表示数值的字符串】
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路:数字的表现格式为(±)A.BE/e(+-)C,A为整数部分,B为小数部分,C为指数部分1、判断整数部分是否有正负号2、判断整数部分的...原创 2019-05-21 19:48:09 · 100 阅读 · 0 评论 -
【剑指Offer学习】【题54:字符流中第一个不重复的字符】
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:创建两个辅助空间:(1)哈希表HashMap:将字符放入表中,并且每次字符对应位置将次数加1;(2)链...原创 2019-05-21 20:35:17 · 110 阅读 · 0 评论 -
【剑指Offer学习】【题65:矩阵中的路径】
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串...原创 2019-05-29 10:47:34 · 124 阅读 · 0 评论 -
【剑指Offer学习】【题64:滑动窗口的最大值】
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-05-28 19:54:48 · 107 阅读 · 0 评论 -
【剑指Offer学习】【题63:数据流中的中位数】
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:创建链表,将数据插入链表中,然后利用Arrays.sort()进行排序,进而获取中位数程序:im...原创 2019-05-28 14:30:26 · 104 阅读 · 0 评论 -
【剑指Offer学习】【题58:对称的二叉树】
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:使用递归的方式进行了比较,另外这里的对称,是说镜像相同。而镜像与原来的是反的。即左子树的左子树与右子树的右子树相同。1、结点为空时,返回true;2、比较左右子结点的值:①当对应左右子结点都为空时,返回true;②当对应左右子结点/一个为空,一个不为空时,说明树不...原创 2019-05-23 21:05:49 · 121 阅读 · 0 评论 -
【剑指Offer学习】【题49:把字符串转换成整数】
题目:题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0思路:1、首先判断是否有符号位,若有,则从字符串的第...原创 2019-05-18 20:48:28 · 106 阅读 · 0 评论 -
【剑指Offer学习】【题48:不用加减乘除做加法】
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:1、将两个数字均转化为二进制;2、sum记录各位相加,但不进位;3、carry记录下进位位;4、将sum与carry相加,直到不产生进位。注意:不考虑进位时,0+0,1+1的结果都为0,0+1,1+0的结果为1。这与异或的结果一样;考虑进位时,0+0,0+1,1+0都不产生进位,只有1+1产生...原创 2019-05-18 19:55:51 · 101 阅读 · 0 评论 -
【剑指Offer学习】【题47:求1+2+3+...+n】
题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:使用递归的方法利用“&&”逻辑与,前面为假,后面语句不再执行的特点,使得n = 0时,停止递归,返回结果。程序:import java.util.Scanner;public class subject47 { pu...原创 2019-05-18 19:36:27 · 111 阅读 · 0 评论 -
【剑指Offer学习】【题61:序列化二叉树】
题目:请实现两个函数,分别用来序列化和反序列化二叉树思路:序列化主要就是在前后端交互时候需要转换下,毕竟网络传输的是流式数据(二进制或者文本),而不是对象。所以序列化二叉树就是转化成字符串。之前解决重建二叉树问题时,我们可以知道,两个遍历序列就可以确定一颗二叉树。(比如前序遍历序列和中序遍历序列)。受此启发,序列化时候我们可以生成一个前序遍历序列和一个中序遍历序列,在反序列化时通过这两个...原创 2019-05-27 13:45:00 · 89 阅读 · 0 评论 -
【剑指Offer学习】【题57:二叉树的下一个结点】
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:可分为两种情况:(1)有右子结点的:下个结点是以该右孩子为根节点的子树的最左边的结点;(2)没有右子结点的:(i)是父结点的左孩子,那么父结点就是下一结点;(ii)是父结点的右孩子,找它父结点的父结点的父结点…直到当前结点是其父结点的左孩...原创 2019-05-22 15:13:28 · 96 阅读 · 0 评论 -
【剑指Offer学习】【题56:删除链表中重复的结点】
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:利用递归的方式,依次进行判断程序: class ListNode { int val; ListNode next = null; L...原创 2019-05-22 10:25:19 · 91 阅读 · 0 评论 -
【剑指Offer学习】【题60:把二叉树打印成多行】
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:与剑指offer第22题类似(https://blog.csdn.net/CheDaqian/article/details/89575456)不同之处在于第22题要求依次输出结点,而本题要求每一层输出一行。引用了start和end分别来记录本层的第几个结点、表示在一层中有几个结点。当start=end时,添加...原创 2019-05-25 19:46:02 · 120 阅读 · 0 评论 -
【剑指Offer学习】【题55:链表中环的入口结点】
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:思路1:创建一个链表用于按扫描的顺序保存节点,直到下一个节点在list中已经存在,那就说明该节点就是入口节点思路2:规律求解创建两个指针p1、p2,其中p1的步长为1,p2的步长为2。让两个指针从头结点开始往后走,如果有环的话,两个指针一定会相遇。程序:程序1:import java.util...原创 2019-05-22 09:23:07 · 109 阅读 · 0 评论 -
【剑指Offer学习】【题40:数组中只出现一次的数字】
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次数字的异或结果。因为其他数字出现了两次,在异或中全部抵消了。由于这两个数字不相等,那么异或结果不为0,也就是说这个结果数字的二进制表示至少有一位为1。我们在结果数字的二进制表示中找到第一个为1的位的位置,记为n位。第...原创 2019-05-14 20:16:36 · 72 阅读 · 0 评论 -
【剑指Offer学习】【题39:平衡二叉树】
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在题38的基础上,只需要判断左右子树的深度差是否小于等于1即可。程序:程序1:public cl...原创 2019-05-14 19:31:53 · 102 阅读 · 0 评论 -
【剑指Offer学习】【题38:二叉树的深度】
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:思路1:利用递归的思想,判断当前结点是否为空,若为空返回0;若不为空,返回左右结点的递归后各自+1的最大值(1表示这一层有数据)思路2:非递归的思想:借助队列来存储节点,来实现层遍历的效果1、先将根结点入队列;2、将根结点出队列。若如果该结点有子结点...原创 2019-05-14 19:05:58 · 114 阅读 · 0 评论 -
【剑指Offer学习】【题22:从上往下打印二叉树】
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:借助队列来存储节点,来实现层遍历的效果1、先将根节点入队列;2、将根节点出队列,打印。若如果该结点有子结点,就把该结点的子结点放到队列的末尾;3、重复步骤2,直到将树遍历完为止,即队列为空。程序:import java.util.ArrayList;import java.util.LinkedList;impo...原创 2019-04-26 19:37:28 · 103 阅读 · 0 评论 -
【剑指Offer学习】【题21:栈的压入、弹出序列】
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:从上面的两个例子可以找到判断一个序列是不是栈的弹出序列的规律:如果下一个弹出...原创 2019-04-26 19:38:07 · 109 阅读 · 0 评论 -
【剑指Offer学习】【题11:二进制中1的个数】
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:思路1:n二进制的最右边的数字与1进行与运算,若结果为1,则加1;然后将1左移1位,继续与n二进制的次右边的数字进行与运算;…;运行32次结束。思路2:将一个整数减去1,再和原整数进行与运算,会发现整数最右边的数字1变为了0。那么整数的二进制有多少个1,就可以进行多少次运算。程序:程序1:import...原创 2019-04-17 15:41:54 · 89 阅读 · 0 评论 -
【剑指Offer学习】【题9:变态跳台阶】
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:程序:import java.util.Scanner;public class subject9 { public static int JumpFloorII(int target) { int result = 1; if(target == 0 |...原创 2019-04-17 14:21:15 · 126 阅读 · 0 评论 -
【剑指Offer学习】【题20:包含min函数的栈】
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:程序:import java.util.Stack;public class subject20 { Stack<Integer> stack1 = new Stack<Integer>();//存放数据栈 Stack<Integer>...原创 2019-04-26 19:42:23 · 116 阅读 · 0 评论 -
【剑指Offer学习】【题10:矩形覆盖】
题目:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:小矩形可以横着放也可以竖着放,用F(n)表示种类数假设竖着放,则剩下F(n-1)种方法假设横着放,则剩下F(n-2)种方法所有一共F(n-1)+F(n-2)种方法考察的还是斐波那契数列程序:import java.util.Scanner;...原创 2019-04-17 12:17:56 · 124 阅读 · 0 评论 -
【剑指Offer学习】【题8:跳台阶】
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:n = 1时,有1种跳法;n = 2时,有2种跳法;n > 2时,假设第一次选择跳1个台阶,则剩下的有F(n-1)种跳法;假设第一次选择跳2个台阶,则剩下的有F(n-2)种跳法。所有一共有F(n-1)+F(n-2)种跳法。此问题可以归结为斐波那契数列...原创 2019-04-17 10:10:42 · 115 阅读 · 0 评论 -
【剑指Offer学习】【题7:斐波那契数列】
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路:方法1:递归;方法2:减少重复计算,将fibNMinusOne 和 fibNMinusTwo用来存之前计算的数,时间复杂度O(n)。程序:public class subject7 { public static int Fibonacci(int...原创 2019-04-16 21:09:59 · 136 阅读 · 0 评论 -
【剑指Offer学习】【题6:旋转数组的最小数字】
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:考察对数组的查找方法:从头到尾遍历数组:时间复杂度O(n)二分查找:时间复杂度O(logn)程序...原创 2019-04-16 10:52:42 · 140 阅读 · 0 评论 -
【剑指Offer学习】【题3:从尾到头打印链表】
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:程序1:笨方法,利用for循环,依次将链表的值倒序存入新链表中。程序2:利用栈(先进后出)来实现。程序:程序1:import java.util.ArrayList;class ListNode{ int val; ListNode next = null; ListNode(int val){...原创 2019-04-12 20:27:13 · 131 阅读 · 0 评论 -
【剑指Offer学习】【题5:用两个栈实现队列】
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:用两个栈实现一个队列,完成队列的Push和Pop操作;队列中的元素为int类型;栈stack1作为用来作入队列,栈stack2用来出队列;当栈stack1和栈stack2全为空时,抛出异常;当栈stack2为空时,栈stack1全部出栈到栈stack2,栈stack2再出栈(即出队列)。...原创 2019-04-16 09:57:44 · 90 阅读 · 0 评论 -
【剑指Offer学习】【题2:替换空格】
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:程序1:首先创建一个新的字符串,然后对输入字符串的每个值进行判断,如果该位置的值是空格,则新字符串后面添加%20,若该位置的值不是空格,则新字符串后面添加对应位置的输入字符串的值。程序2:利用Java里面有个replace...原创 2019-04-12 17:04:21 · 109 阅读 · 0 评论