
剑指offer(java版)
Quantum_Dog
这个作者很懒,什么都没留下…
展开
-
剑指offer+构建乘积数组+java+牛客网补充
题目描述给定一个数组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分两步:1.计算前i - 1个元素的乘积,及后N - i个元素的乘积分别保存在两个数组中。这可以用动态 规划实现。 2.计算B[i...原创 2019-07-30 11:16:58 · 180 阅读 · 0 评论 -
剑指Offer+第18题+树的子结构+java
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。解题思路: 首先看牛客网给出的测试用例: 一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是...原创 2019-02-26 19:47:39 · 192 阅读 · 0 评论 -
剑指Offer+第43题+n个筛子的点数+java
原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入n,打印出s所有可能的值出现的概率。(每个骰子6个面,点数从1到6)解法一:基于递归,时间效率不高递归的思想一般是分而治之,把n个骰子分为第一个和剩下的n-1个。先计算第一个骰子每个点数出现的次数,再计算剩余n-1个骰子出现的点数之和。求n-1个骰子的点数之的方法和前面讲的一样,即再次把n-1个骰子分成两堆------第...原创 2019-03-05 22:31:24 · 290 阅读 · 0 评论 -
剑指Offer+第42题+翻转单词顺序+左旋转字符串+java
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符串的顺序不变。例如输入字符串:“I am a student”,则输出“student a am I”. 将整个过程分成两步, 第一步:旋转句子中的所有字符,比如翻转I am a student中所有单词得到:“tneduts a ma I”。此时不但翻转了句子中单词的顺序,就连单词内字符顺...原创 2019-03-05 21:23:05 · 287 阅读 · 0 评论 -
剑指Offer+第41题+和为s的两个数字+和为s的连续正数序列+java
题目一:输入一个递增排序的数组和一个数字s,在数组中找两个数,使得他们的和刚好是s.如果有多对数字的和等于s,则输出任意一对即可。例如,输入数组{1,2,4,7,11,15}和数字15,则输出4和11(4+11=15)。算法分析: 首先,我们会想到在数组中固定一个数字,再一次判断数组中其余n-1个数字与它的和是不是等于S。不过这个方法的时间复杂度为O(n^2),会不会有更快的...原创 2019-03-05 18:12:37 · 153 阅读 · 0 评论 -
剑指Offer+第40题+数组中只出现一次的数字+java
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).如输入数组{2,4,3,6,3,2,5,5},因为只有4,6这两个数字只出现一次,其他数字都出现了两次,所以输出4,6这是一个比较难的题目,很少有人在面试的时候不需要提示一下子想到最好的解决办法。一般当应聘者想了几分钟那个后还没有思路,面试...原创 2019-03-05 17:15:18 · 297 阅读 · 0 评论 -
剑指Offer+第39题+二叉树的深度+java
题目(问题1):输入一棵二叉树的根节点,求该数的深度。从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度。例如,如下图的二叉树的深度为4,因为它从根节点到叶结点的最长的路径包含4个结点(从根结点1开始,经过2和结点5,最终到达叶结点7)我们可以从另一种角度来理解树的深度。如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子...原创 2019-03-05 16:30:01 · 304 阅读 · 0 评论 -
剑指Offer+第33题+把数组排成最小的数+java
题目:把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.算法分析:1.最直接的办法就是先求出这个数组中所有数字的全排列,然后把每个排列拼接起来,最后求出拼接起来的数字的最小值。求数组的排列和字符串排列非常相近。根据排列组合...原创 2019-03-01 20:19:33 · 370 阅读 · 0 评论 -
剑指Offer+第32题+从1到n整数中1出现的次数+java
题目:从1到n整数中1出现的次数输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。1、累加法时间复杂度:O(nlogn)(不考虑时间效率的解法,肯定不是面试官期望的)累加1到n中每个整数1出现的次数。求每个整数1出现的个数:通过对10求余数,判断整数的个位是否为1,如果商...原创 2019-03-01 19:35:01 · 322 阅读 · 0 评论 -
剑指Offer+第31题+连续子数组的最大和+java
题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)思路:1、数组累加从头到尾逐个累加数组中的每个数字,当累加之和小于0时,从下一个元素开始累加,并通过一个变量保存最大和。2、动态规划,循环思路与1一样,假设f(i)为以第i个数字结尾的子数组的最大和,那么f(i)=A[i], f(i-1...原创 2019-03-01 16:28:29 · 246 阅读 · 0 评论 -
剑指Offer+第38题+数字在排序数组中出现的次数+java
题目:统计一个数字在排序数组中出现的次数。因为是排序数组,那么数组中第一个K之前的数都会比K小,最后一个K之后的数都会比K大,可以分为两步来解决这个问题,分别用二分查找找到数组中第一个K再找到第二个K,这样就可以得到数组中K的个数。在数组中查找K,如果中间的数比K大,那么K出现在前半段;如果比K小,K出现在后半段,那么K出现在后半段;如果等于K,寻找第一个K的算法则需要判断K的前...原创 2019-03-04 22:03:30 · 194 阅读 · 0 评论 -
剑指Offer+第17题+合并两个排序的链表+java
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中的链表1和链表2,则合并之后的升序链表3所示。这是一个经常被各公司采用的面试题。在面试过程中,我们发现应聘者最容易犯两个错误:一是在写代码之前没有对合并的过程想清楚,最终合并出来的链表要么中间断开要么并没有递增排序;二是代码的鲁棒性方面存在问题,程序一旦有特殊的输入(如空链表)就会崩溃。接下来...原创 2019-02-25 16:54:54 · 146 阅读 · 0 评论 -
剑指Offer+第19题+二叉树的镜像+java
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。如下图所示:两棵互为镜像的二叉树:仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤。这两棵树的根节点相同,但它们的左右两个子节点交换了位置。因此我们不妨先在树中交换根节点的两个子节点,就得到了下面的第二颗树: 交换根节点的两个子节点之后,我们注意到值为10,6的结点的子节点仍然保持不变,因此我们还需要交换这两个结点的...原创 2019-02-26 22:24:02 · 290 阅读 · 0 评论 -
剑指Offer+第20题+顺时针打印矩阵+java
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1,2,3,45,6,7,89,10,11,1213,14,15,16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.接下来分析循环结束的条件,假设这个矩阵的行数是rows,列数是columns,打印第一圈的左上角的坐标是(0,0)...原创 2019-02-27 10:47:55 · 295 阅读 · 0 评论 -
剑指Offer+第37题+两个链表的第一个公共节点+java
题目:输入两个链表,找出它们的第一个公共结点。面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,没遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是就找到了他们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然该方法的时间复杂度为O(mn).通常...原创 2019-03-04 21:03:34 · 233 阅读 · 0 评论 -
剑指Offer+第36题+数组中的逆序对+java
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}。看 到这个题目,我们的第一反应就是顺序扫描整个数组。每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,...原创 2019-03-04 15:12:54 · 203 阅读 · 0 评论 -
剑指Offer+第50题+树中两个节点的最低公共祖先+java
题目:求树中两个结点的最低公共祖先思路:考虑一下几种情况:1、二叉搜索树分析:如果树是二叉搜索树的话,就比较容易解决。因为二叉搜索树的特性,左子树的上节点的值比根节点小,右子树上节点的值比根节点大。思路:从树的根节点开始和两个输入的节点进行比较。(1)如果当前节点的值比两个节点的值都大,最低公共祖先结点一定在当前结点的左子树。(2)如果当前节点的值比两个节点的...原创 2019-03-06 22:33:01 · 412 阅读 · 0 评论 -
剑指Offer+第35题+第一个只出现一次的字符+java
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'.方法1,数组实现hashmap在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始。如果从头开始让每一个字符都与其后面的字符相比较,当第一个出现一次的字符,就结束程序。但是这种算法的时间复杂度是O(n^2...原创 2019-03-04 11:32:02 · 236 阅读 · 0 评论 -
剑指Offer+第34题+丑数+java
题目:丑数* 我们把只包含因子2,3,5的数称为丑数(Ugly Number).* 求按从小到大的顺序的第1500个丑数。* 例如6,8都是丑数,但14不是,因为它含有因子7.习惯上我们把1当作第一个丑数方法一:逐个判断每个整数是不是丑数的解法,直观但不够高效:所谓一个数m是另一个数n的因子,是指n能被m整除,也就是说n%m==0.根据丑数的定义,丑数只能被2,3,5整除...原创 2019-03-04 10:29:54 · 205 阅读 · 0 评论 -
剑指Offer+第49题+把字符串转换成整数+java
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。解题思路:1.判断字符串输入是否合法,重点判断一个字符串除第一个字符外是否包含非数字字符,若包含,则返回0,不包含,则进行转换成整数操作;2.取出字符串第一个字符,遍历第一个字符之后的所有字符,计算除第一个字符外的所有字符串组成的整数大小;3.若第一个字...原创 2019-03-06 20:05:16 · 232 阅读 · 0 评论 -
剑指Offer+第47题+不用加减乘除做加法+java
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号输入:5 7输出:12思路:我们分解一下两个数字相加,1、各个位数上的数字相加,但不考虑进位;2、考虑进位;3、将前面两步的结果相加。 对于不能使用四则运算,我们能用的就是位运算,而位运算是针对二进制的。所以,我们根据十进制数的相加方式来考虑二进制。 ...原创 2019-03-06 17:23:24 · 159 阅读 · 0 评论 -
剑指Offer+第46题+求1+2+...+n+java
题目描述:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。方法1可以使用递归的方法解决累加的问题利用”并且“逻辑运算符,前面为假,也不用计算后边的特点,使用n>0来停止递归。左右都必须是关系运算符的表达式,目的是让后边的运行方法2可以使用递归的方法解决累加的问题...原创 2019-03-06 17:04:24 · 392 阅读 · 0 评论 -
剑指Offer+第45题+圆圈中最后剩下的数字+java
题目:0,1,...,n-1 这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。测试样例:输入:0,1 , 2, 3, 4输出:3方法1:经典解法,用环形链表模拟圆圈既然题目中有一个数字圆圈,很自然的想法就是用个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易的想到环形链表。我们可以创建一个共有n个结点的环形链...原创 2019-03-06 16:10:51 · 200 阅读 · 0 评论 -
剑指Offer导航目录+java实现+完整源码
第3题+二维数组中的查找第4题+替换空格第5题+从尾到头打印链表第6题+重建二叉树第7题+两个栈实现队列第8题+旋转数组的最小数字第9题+斐波那契数列第10题+二进制中1的个数第11题+数值的整数次方第12题+打印1到n的最大位数第13题+在O(1)时间删除链表节点第14题+调整数组顺序使奇数位于偶数前面第15题+链表中倒数第k...原创 2019-03-06 15:15:00 · 307 阅读 · 0 评论 -
剑指Offer+第44题+扑克牌的顺子+java
题目:扑克牌的顺子 从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。算法分析:我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把五张牌看成由五个数字组成的数组。大小王是特殊的数字,我们不妨把他们定义为0,这样就能和其他牌区分开来了。接下来我们分析判断...原创 2019-03-06 15:08:29 · 185 阅读 · 0 评论 -
剑指Offer+第16题+反转链表+java
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指针操作来考察应聘者的编码功底。为了避免出错,我们最好先进行全面的分析。在实际软件开发周期中,设计的时间通常不会比编码的时间短。在面试的时候我们不要急于动手写代码,而是一开始仔细分析和涉及,这将会给面...原创 2019-02-25 15:41:17 · 121 阅读 · 0 评论 -
剑指Offer+第15题+链表中倒数第k个节点+java
输入一个链表,输出该链表中倒数第k个结点。解法: 定义两个指指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动; 从第k步开始,第二个指针也开始从链表的头指针开始遍历。 由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾节点时,第二个指针(走在后面的)指针正好是倒数第k个节点。相关题目:1、求链表...原创 2019-02-25 15:01:25 · 135 阅读 · 0 评论 -
堆排序+java
堆的概念在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。举例来说,对于n个元素的序列{R0,R1, ... ,Rn}当且仅当满足下列关系之一时,称之为堆:(1) Ri<= R2i+1且Ri...转载 2019-03-01 10:06:06 · 240 阅读 · 0 评论 -
剑指Offer+第8题+旋转数组的最小数字+java
法1: 旋转数组的特点: 1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素。 2,最小或者最大元素位于两个子数组的分界解题思路:在排序数组中,可以使用二分查找法进行查找利用左右两个指针和中间指针元素大小关系判断中间元素是位于前面的子数组还是后面的子数组,缩小查找范围需要考虑的特例: ...原创 2019-01-07 21:29:40 · 161 阅读 · 0 评论 -
剑指Offer+第7题+两个栈实现队列+两个队列实现栈+java
两个栈实现队列:import java.util.Stack;public class Offer07 { private static Stack<Object> stack1 = new Stack<>(); private static Stack<Object> stack2 = new Stack<>(); //...原创 2019-01-07 19:33:06 · 184 阅读 · 0 评论 -
二叉树前序、中序、后序递归与非递归遍历+层序遍历(java)
前序递归遍历算法:访问根结点-->递归遍历根结点的左子树-->递归遍历根结点的右子树 中序递归遍历算法:递归遍历根结点的左子树-->访问根结点-->递归遍历根结点的右子树 后序递归遍历算法:递归遍历根结点的左子树-->递归遍历根结点的右子树-->访问根结点层序遍历算法:将每个节点放入队列中。依据队列先进先出的特点,顺序遍历树。直到队列为空...原创 2019-01-07 13:17:47 · 303 阅读 · 0 评论 -
剑指Offer+第11题+数值的整数次方+java
方法1,自以为题目简单的算法代码:public class Offer11_1 { public double Power(double base, int exponent){ double result = 1.0; for(int i =1;i<=exponent;i++){ result *= base; } return result;...原创 2019-01-11 10:36:13 · 152 阅读 · 0 评论 -
剑指Offer+第10题+二进制中1的个数+java
方法1,存在死循环代码:public class Offer10_1 { //解法1,可能引起死循环的解法 public int NumberOf1(int n){ int count = 0; while(n != 0){//有可能是负数 if((n&1) !=0)//如果n&1外面没有各异括号的话,会报错,提示"&"符号未定义 ...原创 2019-01-10 14:45:42 · 196 阅读 · 0 评论 -
剑指Offer+第9题+斐波那契数列+java
思路 如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。 要避免重复计算,采用从下往上计算,可以把计算过了的保存起来,下次要计算时就不必重复计算了:先由f(0)和f(1)计算f(2),再由f(1)和f(2)计算f(3)……以此类推就行了,计算第n个时,只要保存第n-1和第n-2项就可以了。书里面有同时提到了两个问题:1:青蛙跳台阶;2:矩形匹配问题(实际上...原创 2019-01-10 13:09:27 · 220 阅读 · 0 评论 -
剑指Offer+第6题+重建二叉树+java
思路:先找出根节点,然后利用递归方法构造二叉树代码实现:import java.util.Arrays;class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){val = x;}}public class Offer06 { public TreeNode reConstructB...原创 2018-12-10 16:44:28 · 173 阅读 · 1 评论 -
剑指Offer+第3题+二维数组中的查找+java
3.在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从右上角或左下角开始找,逐行删除,或者用二分法查找代码: public class Offer03 { public boolean Find(int [][] arrays, int target...原创 2018-11-23 14:02:19 · 204 阅读 · 0 评论 -
剑指Offer+第5题+从尾到头打印链表+java
思路:借助栈实现,或使用递归的方法。代码实现:import java.util.ArrayList;import java.util.Stack;//定义链表结构,如果这部分代码放到类Offer05里面就会报错;如果非把ListNode放到类Offer05里面就要在class ListNode{...}前面加上staticclass ListNode{ ListNode nex...原创 2018-11-25 17:19:51 · 141 阅读 · 0 评论 -
剑指Offer+第4题+替换空格+java
思路:从后往前复制,数组长度会增加,或使用StringBuilder、StringBuffer类代码:public class Offer_04 { public String replaceSpace(String str){ if(str == null||str.length()<=0)//str == null判断字符串是个null指针,str.length()<...原创 2018-11-25 16:32:41 · 207 阅读 · 0 评论 -
剑指Offer+第12题+打印1到n的最大位数+java
方法1,在字符串上模拟数字加法的解法代码:import java.util.Arrays;public class Offer12_1 { public void print1ToMaxNDigits(int n){ if(n <= 0) throw new RuntimeException("n can't lower zero"); ch...原创 2019-01-14 15:18:37 · 185 阅读 · 0 评论 -
剑指Offer+第13题+在O(1)时间删除链表节点+java
代码://前提:假设要删除的节点存在于链表中//删除i节点,先把i的下一个节点j的内容复制到i,然后把节点i的指针指向节点j的下一个节点public class Offer13 { static class ListNode{ int val; ListNode next; ListNode(int val){ this.val = val; }...原创 2019-01-14 21:11:52 · 139 阅读 · 0 评论