剑指offer(刷题java)
alan_gaohaodong
加油!
展开
-
对称二叉树(剑指offer第28题)
一、问题描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3示例 1:输入:root = [1,2,2,3,4,4,3]输...原创 2020-10-16 15:31:45 · 246 阅读 · 0 评论 -
数组中重复的数字(剑指 Offer第3题)java实现
一、题目描述找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000二、解题思路这是一道简单题,思路很简单。解法一:使用哈希表,hashmap解法二:使用数组,由于题目限制了n的大小,..原创 2020-09-15 16:12:36 · 266 阅读 · 0 评论 -
滑动窗口的最大值(剑指offer第65 题)
一、题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{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,...原创 2018-12-20 09:53:55 · 172 阅读 · 0 评论 -
链表中环的入口结点(剑指offer56题)
一、题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。二、解题思路方法一、利用set的add方法或list的contains方法。但是list 的contains方法时间复杂度为n^2,尽量用set的add方法,时间复杂度为O(1)方法二、利用快慢指针思想(推荐) 时间复杂度为O(n),空间复杂度为O(1)证明:假设x为环前面的路程(黑...原创 2018-12-14 14:30:30 · 149 阅读 · 1 评论 -
和为S的两个数字(剑指offer第43题)
一、题目描述 * 输入一个递增排序的数组和一个数字S,在数组中查找两个数, * 使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 * 输出描述: 对应每个测试案例,输出两个数,小的先输出。二、解题思路方法一、暴力法,时间复杂度n^2,不推荐用方法二、首尾指针向中间移动。递增序列外围的乘积小于内层的乘积。三、j...原创 2018-12-07 10:37:27 · 93 阅读 · 0 评论 -
数据流中的中位数(剑指offer第64题)
一、题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值, 那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值, 那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流, 使用GetMedian()方法获取当前读取数据的中位数。二、解题思路方法一、利用list来保存读入的数据流,在利用list的sor...原创 2018-12-19 16:28:51 · 181 阅读 · 0 评论 -
和为S的连续正数序列(剑指offer第42题)
一、题目描述 * 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和, * 他马上就写出了正确答案是100。但是他并不满足于此, * 他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。 * 没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。 * 现在把问题交给你,你能不能也很快的找出所有和为S的...原创 2018-12-06 17:26:00 · 167 阅读 · 0 评论 -
字符流中第一个不重复的字符(剑指offer第55题)
一、题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。二、解题思路...原创 2018-12-13 17:16:52 · 705 阅读 · 0 评论 -
表示数值的字符串(剑指offer第54题)
一、题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。二、解原创 2018-12-13 16:18:24 · 192 阅读 · 0 评论 -
二叉搜索树的第k个结点(剑指offer第63题)
一、题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。二、解题思路 思路:搜索二叉树采用中序遍历的结果就是排好序的,我们用list保存下遍历的结果,在找到第k个值。 改进思路:不用list保存,使用一个变量作为计数器,累加到k值时,返回(递归遍历)三、java代码...原创 2018-12-19 14:10:55 · 152 阅读 · 0 评论 -
序列化二叉树(剑指offer第62题)
一、题目描述请实现两个函数,分别用来序列化和反序列化二叉树二、解题思路 序列化时:将该二叉树以先序遍历(中、后和层序遍历都可以,这里以先序遍历为例),如果结点是空的就放入“#!”,如果结点 不是空的就在结点末尾加入“!”即可。这样就形成了一个字符串。 反序列化时:将该字符串用“!”分割开,放到数组里,在将数组转换成二叉树,注意结点空时,对应的数...原创 2018-12-19 14:01:47 · 109 阅读 · 0 评论 -
数组中只出现一次的数字(剑指offer第41题)
一、 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。 请写程序找出这两个只出现一次的数字。二、解题思路先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数。 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到...原创 2018-12-06 15:18:55 · 165 阅读 · 0 评论 -
平衡二叉树(剑指offer第40题)
一、题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。二、解题思路二叉树的后序遍历,递归求解。左右子树是否是平衡二叉树,如果是再求根节点是否是平衡二叉树,一直递归。三、java代码public class Solution_40 { /* * 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 */ class Tuple{ private bool...原创 2018-12-06 10:46:58 · 86 阅读 · 0 评论 -
数组中的逆序对(剑指offer第36题)
一、题目描述 * 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 * 输入一个数组,求出这个数组中的逆序对的总数P。 * 并将P对1000000007取模的结果输出。 即输出P%1000000007 * * 输入描述: 题目保证输入的数组中没有的相同的数字 * * 数据范围: * ...原创 2018-12-03 17:17:58 · 216 阅读 · 0 评论 -
正则表达式匹配(剑指offer第53题)
一、题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符, 而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配二、解题思路由于‘.’是万能的可以当成任...原创 2018-12-12 17:29:46 · 164 阅读 · 0 评论 -
左旋转字符串(剑指offer第44题)
一、题目描述 * 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务, * 就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S, * 请你把其循环左移K位后的序列输出。 * 例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果, * 即“XYZdefabc”。是不是很简单?OK,搞定它!二...原创 2018-12-07 14:42:38 · 165 阅读 · 0 评论 -
翻转单词顺序列(剑指offer第45题)
一、题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志, 写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看, 但却读不懂它的意思。例如,“student. a am I”。后来才意识到, 这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。 ...原创 2018-12-10 10:49:01 · 77 阅读 · 0 评论 -
扑克牌顺子(剑指offer第46题)
一、题目描述 * LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王, * 2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌, * 想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票, * 嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了, *...原创 2018-12-10 15:41:28 · 453 阅读 · 0 评论 -
把二叉树打印成多行(剑指offer第61题)
一、题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行二、解题思路层序遍历的方法用栈和队列都可以三、java代码public class Solution_61 { /** * 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行 */ ArrayList<ArrayList<Integer>...原创 2018-12-18 16:01:50 · 116 阅读 · 0 评论 -
按之字形顺序打印二叉树( 剑指offer第60题)
一、题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。二、解题思路方法一、采用二叉树的层序遍历,设置一个标志位,如果是奇数,就正层序遍历,如果是偶数,就逆层序遍历方法二、采用两个栈,一个是放奇数层,一个是放偶数层三、java代码public clas...原创 2018-12-18 15:38:57 · 111 阅读 · 0 评论 -
机器人的运动范围(剑指offer第67题)
一、题目描述 * 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动, * 每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 * 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38), * 因为3+5+3+8 = 19。请...原创 2018-12-23 22:25:30 · 197 阅读 · 0 评论 -
矩阵中的路径(剑指offer第66题)
一、题目描述 * 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 * 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 * 如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e * 这样的3 X 4 矩阵中包含一条字符串"b...原创 2018-12-23 21:19:58 · 201 阅读 · 1 评论 -
对称的吧二叉树(剑指offer第59题)
一、题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。二、 解题思路方法一:采用层序遍历二叉树利用辅助数据结构 队列 或者 栈,每次成对插入和取出两,进行比较方法二、巧妙利用递归,比较本身和镜像,控制好递归条件,直接看代码即可理解!三、java代码public class Solution_59 { ...原创 2018-12-18 11:05:35 · 113 阅读 · 0 评论 -
叉树的下一个结点 (剑指offer第58题)
一、题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。二、 解题思路熟悉中序遍历的模式中左右,下一个节点可以分为以下三种情况:该节点有右节点,那么下一个节点就是右节点子树部分中的左节点该节点没有右节点,但是是父节点的左节点,那么,下一个节点就是父节点该节点没有右节点,同...原创 2018-12-18 10:30:53 · 100 阅读 · 0 评论 -
构建乘积数组(剑指offer第52题)
一、题目描述 * 给定一个数组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]。 * 不能使用除法。二、解题思路无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。 考虑到计算每个B[i]时都会有重复,思考B[i...原创 2018-12-12 11:10:16 · 288 阅读 · 0 评论 -
数组中重复的数字(剑指offer第51题 )
一、题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的, 但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。二、解题思路1、排序将数组排序,然后扫描排序后的数组即可。时间...原创 2018-12-12 10:09:38 · 873 阅读 · 0 评论 -
删除链表中重复的结点(剑指offer第57题)
一、题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点, 重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5二、解题思路方法一、递归实现、将问题简单化,解决完子问题再拼装。方法二、三指针法、 双层循环,但是最大时间复杂度为O(n^2) 三...原创 2018-12-18 09:11:26 · 124 阅读 · 0 评论 -
把字符串转换成整数(剑指offer第50题)
一、题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0), 要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述...原创 2018-12-11 16:47:31 · 285 阅读 · 0 评论 -
不用加减乘除做加法(剑指offer第49题)
一、题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。二、解题思路 方法一:BigInteger的add方法 方法二:用异或^求出每个位在没有进位时的值,再用按位与&求出每个位的进位值再向左偏移<<一位 方法三:使用sum函数 方法四:使用递归写法,思路同方法二 ps:推荐思路二三、java代...原创 2018-12-11 15:03:38 · 109 阅读 · 0 评论 -
求1+2+3+...+n(剑指offer第48题)
一、题目描述 * 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case * 等关键字及条件判断语句(A?B:C)。二、解题思路 * 这里可以通过递归的方式进行计算,但是很疑问的地方在于如何结束递归。 * 这里可以有多种的方式,基本方向是采用逻辑与或的方式来计算,与的时候通过n&g...原创 2018-12-11 11:24:30 · 186 阅读 · 0 评论 -
孩子们的游戏(剑指offer第47题)
一、题目描述 * 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。 * HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的: * 首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。 * 每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,...原创 2018-12-11 10:55:21 · 268 阅读 · 0 评论 -
二叉树的深度(剑指offer第39题)
一、题目描述输入一棵二叉树,求该树的深度。 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径, 最长路径的长度为树的深度。二、解题思路方法一、用递归求解,分别求左子树和右子树的深度,取两者大的再加一方法二、用循环求解,层序遍历,求出层数就是树的深度。三、java代码public class Solution_39 { /**...原创 2018-12-05 15:25:27 · 97 阅读 · 0 评论 -
第一个只出现一次的字符(剑指offer第35题)
一、题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符, 并返回它的位置, 如果没有则返回 -1(需要区分大小写).二、解题思路利用哈希思想,映射到数组中三、java代码public class Solution_35 { /** * 在一个字符串(0<=字符串长度<=1000...原创 2018-12-03 14:43:56 · 195 阅读 · 0 评论 -
丑数(剑指offer第34题)
一、题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。 例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。二、解题思路思路一:暴力法,用循环迭代出,但复杂度太高,不推荐。思路二:(推荐使用该方法)根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(...原创 2018-12-03 10:46:12 · 144 阅读 · 0 评论 -
树的子结构(剑指offer第十七题)
一、题目描述输入两棵二叉树A,B,判断B是不是A的子结构。 (ps:我们约定空树不是任意一个树的子结构)二、解题思路非完全二叉树的规律难寻,一般的通用方法是递归求解。大致思路是:先判断A的根节点和B的根节点是否相同; 如果相同,再判断A的左右子节点和B的左右子节点是否相同; 如果相同则将...原创 2018-08-30 21:51:03 · 148 阅读 · 0 评论 -
合并两个排序的链表(剑指offer第十六题)
一、题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二、题目解析 (1)递归做法:两个链表分别取各自的第一个结点值, 比较大小,将较小值(如果等于时取第一个链表值)链入结果链表中。 (2)非递归做法:用循环来轮流判断两个链表各自第一个结点的值。直到用完其中的一个链表为止。三、可运行java代码public class...原创 2018-08-16 22:07:37 · 166 阅读 · 0 评论 -
反转链表(剑指offer第十五题)
一、题目描述 输入一个链表,反转链表后,输出新链表的表头。二、解题思路 需要额外的两个“指针”(java里没有指针这个概念,暂且用来理解),第一个指针temp用来指向链表已经逆序了的部分的头部,指针nextNode用来指向未逆序的部分的头部,不断地将nextNode链表部分的结点一个一个地给了temp链表部分。三、可运行代码(java)/** *...原创 2018-08-15 10:58:38 · 219 阅读 · 0 评论 -
链表中倒数第k个结点(剑指offer第十四题)
一、题目描述 输入一个链表,输出该链表中倒数第k个结点。二、思路解析 方法一、常规思路,先求出总长度,再遍历链表一直到 倒数第K个结点 为止。 方法二、用两个指针p,q,p用来遍历整个链表,q用来把前k个作“”废掉“”,q指针正好到倒数第K个三、可运行java代码// 输入一个链表,输出该链表中倒数第k个结点。public class Solution...原创 2018-07-20 21:24:52 · 184 阅读 · 0 评论 -
旋转数组的最小数字(剑指offer第六题)
一、题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 二、思路分析: 我自己的思路是这样的,先把这个旋转数组的各种情况都考...原创 2018-07-07 16:10:35 · 309 阅读 · 0 评论 -
数值的整数次方(剑指offer第十二题)
一、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。二、思路解析(1)常规思路:求次方的常规思路就是累积乘起来,所以可以用循环进行,但一定要注意特殊情况,保证程序的健壮性。(2)用快速幂思想:分情况...原创 2018-07-13 09:49:00 · 209 阅读 · 0 评论