
剑指Offer
EdmundDshi
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
52.剑指Offer之字符串的排列
目录1题目描述:2解题思路3.编程实现(Java):1题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。2解题思路 本题有以下三种解法: 第一种:先按照next复制,然后依次添加random指针,添加时需要定位random的位置,定位一次需要一次遍历,需要O(n^2)的复原创 2020-07-28 18:04:16 · 195 阅读 · 0 评论 -
51.剑指Offer之复杂链表的复制
目录1题目描述:2解题思路3.编程实现(Java):1题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。2解题思路 本题有以下三种解法: 第一种:先按照next复制,然后依次添加random指针,添加时需要定位random的位置,定位一次需要一次遍历,需要O(n^2)的复杂度。 第二种:先按照next复制,然后用原创 2020-07-27 14:43:08 · 221 阅读 · 0 评论 -
50.剑指Offer之二叉树中和为某一值的路径
目录1题目描述:2解题思路3.编程实现(Java):1题目描述: 输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)2解题思路 本题实质上就是深度优先搜索。使用前序遍历的方式对整棵树进行遍历,当访问到某一个结点时,将该结点添加到路径上,并且累加该结点的值。当访问到的结点是叶结点时,如果路径中的结点值之和正好等于输入的整数,则说明是一条符合要求的路原创 2020-07-27 12:30:25 · 337 阅读 · 0 评论 -
49.剑指Offer之二叉搜索树的后序遍历序列
目录1题目描述:2.1后序遍历2.2解题思路3.编程实现(Java):1题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2.1后序遍历 后序遍历:左子树 —> 右子树 —> 根结点,上面二叉搜索树输出{5,7,6,9,11,10,8}。2.2解题思路 对于后续遍历序列,序列的最后一个值一定是树的根结点,而由二叉搜索树的性质:左小右大,我们可以从头开始遍历,当遍历到某个值比根结原创 2020-07-25 20:18:30 · 206 阅读 · 0 评论 -
48.剑指Offer之包含min函数的栈
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。2.解题思路 使用两个stack,一个为数据栈,另一个为辅助栈。数据栈用于存储所有数据,每次压栈的最小元素(之前的最小元素和新压入栈中的元素,二者的较小值)保存起来放入辅助栈。3.编程实现(Java):public class minFunction_48 { Stack<Integer> stack =原创 2020-07-25 19:58:07 · 264 阅读 · 0 评论 -
47.剑指Offer之顺时针打印矩阵
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.2.解题思路 由于是按照从外到内的顺序依次打印,所以可以把矩阵想象成若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一圈。而对于每一圈的打印,很自然便可以想到遵循原创 2020-07-25 12:08:59 · 194 阅读 · 0 评论 -
46.剑指Offer之树的子结构
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2.解题思路 要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步,在树A中找到和树B的根结点值一样的结点R;第二步,判断树A中以R为根结点的子树是不是包含和树B一样的结构。 对于这两步,第一步实际上就是树的遍历,第二步是判断是否有相同的结构,这两步都可以通过递归来实现。 以上面为例,先在A中找到值为8的节点,接着判原创 2020-07-24 20:51:31 · 230 阅读 · 0 评论 -
45.剑指Offer之链表中倒数第k个结点
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 输入一个链表,输出该链表中倒数第k个结点。2.解题思路 对于单链表来说,没有从后向前的指针,因此一个直观的解法是先进行一次遍历,统计出链表中结点的个数n,第二次再进行一次遍历,找到第n-k+1个结点就是我们要找的结点,但是这需要对链表进行两次遍历。 为了实现一次遍历,我们这里采用双指针解法。我们可以定义两个指针,第一个指针从链表的头指针开始先向前走k步,第二个指针保持不动,从第k+1步开始,第二个指针也从头开始前进,两个指针原创 2020-07-24 20:32:42 · 251 阅读 · 0 评论 -
44.剑指Offer之调整数组顺序使奇数位于偶数前面
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2.解题思路 对数组进行遍历,设置两个指针even和odd,even指向当前第一个偶数,odd从这个偶数之后开始查找,找到第一个奇数,此时为了相对位置不变,不能直接交换even和odd,而是将从even到odd-1的元素都依次向后移一个位置,将odd指向的那个奇数原创 2020-07-24 20:24:36 · 272 阅读 · 0 评论 -
43.剑指Offer之从尾到头打印链表
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。2.解题思路 三种方法:借助栈、递归、列表的首位插入 从头到尾打印链表比较简单,从尾到头很自然的可以想到先将链表进行反转,然后再打印。但是,通常我们不希望改变原链表的结构,这是一个只读操作。因此,我们进一步分析,可以发现排在后面的先输出,这是一个典型的“后入先出”的思想,因此很自然的可以想到用栈来实现,每遍历一个结点,可以将其压入栈中,遍历结束后再逐个弹栈,将结点原创 2020-07-24 11:15:11 · 258 阅读 · 0 评论 -
42.剑指Offer之替换空格
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2.解题思路 对于这个题目,我们首先想到原来的一个空格替换为三个字符,字符串长度会增加,因此,存在以下两种不同的情况:(1)允许创建新的字符串来完成替换。(2)不允许创建新的字符串,在原地完成替换。 第一种情况比较简单。对于第二种情况,有以下两种解法:时间复杂度为O原创 2020-07-23 14:51:13 · 182 阅读 · 0 评论 -
41.剑指Offer之二维数组中的查找
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.解题思路 很明显,由于该二维数组上到下递增,左到右递增的特殊性,遍历整个矩阵进行查找不是该题目的意图所在。总结规律我们可以发现:应该从矩阵的右上角或者左下角开始查找。 以右上角为例,首先选取右上角的数字,如果该数字等于要查找的数字,原创 2020-07-23 14:30:39 · 188 阅读 · 0 评论 -
40.剑指Offer之剪绳子
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述: 输入一个数n,意义见题面。(2 <= n <= 60)输出描述: 输出答案。示例: 输入8,输出182.解题思原创 2020-07-23 11:29:51 · 285 阅读 · 0 评论 -
39.剑指Offer之数据流中的中位数
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。2.解题思路 首先要正确理解此题的含义,数据是从一个数据流中读出来的,因此数据的数目随着时间的变化而增加。对于从数据流中读出来的数据,当然要用一个数据原创 2020-07-21 14:14:56 · 265 阅读 · 0 评论 -
38.剑指Offer之从上往下打印二叉树
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。2.解题思路 本题可类比剑指offer第60题:把二叉树打印成多行,这两道题实际上是一回事,实际上大同小异,稍加修改即可。 本题实际上就是二叉树的层次遍历,深度遍历可以用递归或者栈,而层次遍历很明显应该使用队列。同样我们可以通过一个例子来分析得到规律:每次打印一个结点时,如果该结点有子结点,则将子结点放到队列的末尾,接下来取出队列的头重复前面的打印动作,直到队列中所有的结原创 2020-07-20 15:11:08 · 196 阅读 · 0 评论 -
37.剑指Offer之把二叉树打印成多行
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2.解题思路 本题可类比剑指offer第22题:从上往下打印二叉树,这两道题实际上是一回事,只不过这里我们多了一个分行打印的要求,实际上大同小异,稍加修改即可。 在二叉树层次遍历上,我们使用的是队列,借助队列先进先出的性质实现,具体规律:每次打印一个结点时,如果该结点有子结点,则将子结点放到队列的末尾,接下来取出队列的头重复前面的打印动作,直到队列中所有的结点都原创 2020-07-20 15:00:07 · 229 阅读 · 0 评论 -
36.剑指Offer之二叉树的下一个结点
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.解题思路 中序遍历的知识补充看此博客,对于中序遍历序列来说,遵循“左->根->右”的顺序,在深刻理解中序遍历的基础上,结合一些具体的实例我们不难得出以下结论。如果一个结点有右子树,那么它的下一个结点就是它的右子树中最左边的那个结点,也就是说,从它的右子结点出发一直访问左指针,最原创 2020-07-20 14:13:14 · 184 阅读 · 0 评论 -
35.剑指Offer之链表中环的入口结点
目录1题目描述:2.解题思路2.1解法一 HashMap2.2解法二 快慢指针3.编程实现(Java):1题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.解题思路2.1解法一 HashMap 本题是一个比较典型的链表题目,难度适中。遍历链表,并且把遍历过的节点用 HashSet 存起来,如果遍历过程中又遇到了之前的节点,说明这个节点就是我们要找到入口点。如果到达了 null 就说明没有环。public class EntryNodeOfLoop_35原创 2020-07-20 13:20:51 · 203 阅读 · 0 评论 -
34.剑指Offer之第一个只出现一次的字符
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)2.解题思路 本题有点类似于剑指offer的第54题:字符流中第一个不重复的字符。解题思路也比较类似。 对于本题,这里给出以下三种解法:(1)用 HashMap 建立每个字符与其出现次数的映射,然后再依次遍历字符串时,找到第一个出现次数为1的字符,返原创 2020-07-17 10:32:02 · 246 阅读 · 0 评论 -
33.剑指Offer之字符流中第一个不重复的字符
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流不存在只出现一次的字符,返回“#”字符。2.解题思路 本题有点类似于剑指offer的第34题:第一个只出现一次的字符,只不过本题是字符流序列。解题思路也比较类似,将字节流保存起来,通过哈希表统计每个字符出现原创 2020-07-17 10:25:41 · 295 阅读 · 0 评论 -
32.剑指Offer之数组中重复的数字
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100", “5e2”, “-123”," 3.1416" 和 “-1E-16” 都表示数值。 但是 “12e”, “1a3.14”, “1.2.3”, “±5” 和 “12e+4.3” 都不是。2.解题思路 表示数值的字符串遵循共同的模式:A[.[B]][e|EC]或者.B[e|EC]。以上模式的含义是:A为数值的整数部分,B为跟在小数点之后的小数部分原创 2020-07-17 09:56:36 · 195 阅读 · 0 评论 -
31.剑指Offer之数组中重复的数字
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。2.解题思路 思路采用非暴力查找和不消耗额外空间的算法:数组重排。把原数组重新排列为一个元素和对应下标值相同的数组。该算法看起来是两层循环,但是每个数字最多进行两次交原创 2020-07-15 12:03:51 · 195 阅读 · 0 评论 -
30.剑指Offer之求1+2+3+4+···+n
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.解题思路 本题本身没有太多的实际意义,但是可以对程序员的发散思维能力进行考察,进而可以反映出对编程相关技术理解的深度。 可以通过递归来实现加法,但是由于无法使用if语句,因此对于递归的结束条件无法进行判断,这里用一个比较巧妙的思路:与运算的短路特性,所谓短路,比如 A &&am原创 2020-07-15 10:57:20 · 446 阅读 · 0 评论 -
29.剑指Offer之孩子们的游戏(圆圈中最后剩下的数)
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 每年六一儿童节,张东升都会准备一些小礼物去看望孤儿院的普普和严良,今年亦是如此。张朝阳作为张东升的资深摄影发烧友,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且获得原创 2020-07-13 16:36:14 · 205 阅读 · 0 评论 -
28.剑指Offer之扑克牌顺子
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看原创 2020-07-13 14:27:12 · 212 阅读 · 0 评论 -
27.剑指Offer之左旋转字符串
目录1题目描述:2.解题思路3.编程实现(Java):1题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!2.解题思路 对于本题,从最直观的角度我们首先可以想到暴力解法。还是那句话:最容易想到的解法往往不是最优的。 将字符串分为两部分,即前k个原创 2020-07-13 13:50:57 · 264 阅读 · 0 评论 -
26.剑指Offer之和为S的两个数字
目录1.1题目描述:1.2输出描述:2.解题思路3.编程实现(Java):1.1题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。1.2输出描述: 对应每个测试案例,输出两个数,小的先输出。2.解题思路 看到题目,我们的第一感觉是暴力解法,即先在数组中固定一个数字,然后依次判断数组中其他数字与它的和是不是等于S。这显然复杂度为O(n^2)。 进一步分析,类似于上一题的思路,我们可以使用双指针解法。原创 2020-07-12 16:59:22 · 300 阅读 · 0 评论 -
25.剑指Offer之和为S的连续正数序列
目录1.1题目描述:1.2输出描述:2.解题思路3.编程实现(Java):1.1题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!1.2输出描述: 输出所有和为S的连续正数序列。序列内按照从小至原创 2020-07-12 15:23:22 · 214 阅读 · 0 评论 -
24.剑指Offer之数组中只出现一次的数字
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。2.解题思路 这道题目相对比较难,一般情况下,我们首先可以想到的是顺序扫描数组,但其时间复杂度为O(n^2)。进一步也可以想到用哈希表保存每一个数次出现的次数,但是这使用了辅助空间,空间复杂度为O(n)。显然均不满足题目要求。 如果数组中只有一个数字出现一次,其他都出现两次。那么我们原创 2020-07-12 14:16:22 · 236 阅读 · 0 评论 -
23.剑指Offer之平衡二叉树
目录1.题目描述:2.解题思路2.1平衡数2.2后序遍历2.3解题思路3.编程实现(Java):1.题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。2.解题思路2.1平衡数 平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。2.2后序遍历 对上图平衡二叉树作为例子,采用后序遍历,先左节点 ->右节点原创 2020-07-11 17:10:33 · 367 阅读 · 0 评论 -
22.剑指Offer之数字在排序数组中出现的次数
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于数字3在该数组中出现了4次,所以函数返回4。2.解题思路 方法一:最简单的方法就是遍历整个数组。 方法二:看到排序数组,首先考虑二分查找。我们找到数字在排序数组中最先出现和最后出现的下标,即得到次数。3.编程实现(Java)://方法一public int GetNumberOfK(int[] array, int原创 2020-07-11 15:12:12 · 198 阅读 · 0 评论 -
21.剑指Offer之两个链表的第一个公共结点
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 输入两个链表,找出它们的第一个公共结点。2.解题思路 方法一:将两个链表拼接起来。 将两个链表进行拼接,一个链表1在前链表2在后,另一个链表2在前链表1在后,则合成的两个链表一样长,然后同时遍历两个链表,就可以找到公共结点,时间复杂度同样为O(m+n)。 方法二:借助辅助栈。我们可以把两个链表的结点依次压入到两个辅助栈中,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出继续原创 2020-07-11 14:35:54 · 212 阅读 · 0 评论 -
20.剑指Offer之从1到n整数中1出现的次数
目录1.题目描述:2.解题思路2.1暴力算法2.2数学公式法2.2.1个位:2.2.2十位:2.2.3百位:3.编程实现(Java):1.题目描述: 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1-13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。2.解题思路2.1暴力算法 遍历从原创 2020-07-10 18:52:17 · 329 阅读 · 0 评论 -
19.剑指Offer之连续子数组的最大和
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少原创 2020-07-10 16:33:33 · 316 阅读 · 0 评论 -
18.剑指Offer之数组中出现次数超过一半的数字
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2.解题思路 方法一:遍历数组,用 HashMap 保存每个数出现的次数,这样可以从map中直接判断是否有超过一半的数字,这种算法的时间复杂度为O(n),但是这个性能提升是用O(n)的空间复杂度换来的原创 2020-07-10 16:00:34 · 202 阅读 · 0 评论 -
17.剑指Offer之二叉搜索树与双向链表(超详细,代码一步一步推导)
目录1.题目描述:2.1什么是二叉搜索树?2.1什么是双向链表?2.3解题思路3.编程实现+详细推导(Java):4.完整代码1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2.1什么是二叉搜索树? 二叉查找树(又叫:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树(结构如下图):若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它原创 2020-07-09 19:00:14 · 393 阅读 · 0 评论 -
16.剑指Offer之栈的压入、弹出序列
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2.解题思路 本题很直观的一个想法就是建立一个辅助栈,用该栈根据给出的序列来模拟压栈、弹栈动作,进而判断该序列是否可能正确。原创 2020-07-08 18:26:40 · 229 阅读 · 0 评论 -
15.剑指Offer之合并两个排序的链表
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2.解题思路 首先需要判断几个特殊情况,即判断输入的两个指针是否为空。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。 两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针,剩余的结点仍然是排序的,所原创 2020-07-08 11:43:46 · 194 阅读 · 0 评论 -
14.剑指Offer之反转链表
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 输入一个链表,反转链表后,输出新链表的表头。2.解题思路 (1)首先要判断给出的头节点是否为空,如果为空直接返回,如果不为空才可以进行反转。因为每个节点只有一个next指针记录它的下一 个节点的地址,所以应该需要两个变量分别记录当前节点左右两边的节点,否则反转链表之后就没办法连上后面的节点了。通过循环遍历当前链表,在遍历过程中反转链表,当前节点遍历到最后为nul时,循环停止,此时当前节点为null,所以它的前一-个节点就是新原创 2020-07-07 22:55:22 · 174 阅读 · 0 评论 -
13.剑指Offer之数值的整数次方
目录1.题目描述:2.解题思路3.编程实现(Java):1.题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为02.解题思路 本题看似比较简单,但需要完整的考虑到所有情况。首先,对于底数,如果底数为0,则0的任何次方都是0,可以直接返回0。关键在于指数,指数可能有三种情况,有可能是正数、0、负数。对于指数是0的情况,任何数的0次方为1。对于指数是负数的情况,可以将其转化为绝对值计算,求出原创 2020-07-07 18:03:52 · 270 阅读 · 0 评论