![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【剑指offer】
小呀小二笙
斯人若彩虹,遇上方知有~~~
展开
-
【剑指offer】构建乘积数组
题目描述给定一个数组A[0,1,...,n−1]A[0,1,...,n-1]A[0,1,...,n−1],请构建一个数组B[0,1,...,n−1]B[0,1,...,n-1]B[0,1,...,n−1],其中BBB中的元素B[i]=A[0]∗A[1]∗...∗A[i−1]∗A[i+1]∗...∗A[n−1]B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]B...原创 2019-04-09 22:53:32 · 85 阅读 · 0 评论 -
【剑指offer】删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1−>2−>3−>3−>4−>4−>51->2->3->3->4->4->51−>2−>3−>3...原创 2019-04-11 14:38:57 · 65 阅读 · 0 评论 -
【剑指offer】链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出nullnullnull。思路:1)首先利用快慢指针判断是否有环,如果无环则返回null,有环则进行下一步操作2)如果有环,即可看作下图的示例,假设ABABAB段即环外的长度为LLL,BPBPBP段即从进入环到交点的长度为xxx,整个环的长度设为mmm;假设慢指针在环中所走的圈数为ttt,快指针所走的圈数为kkk,那么...原创 2019-04-11 13:05:50 · 187 阅读 · 0 评论 -
【剑指offer】字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go""go""go"时,第一个只出现一次的字符是"g""g""g"。当从该字符流中读出前六个字符“google"“google&...原创 2019-04-11 12:38:32 · 82 阅读 · 0 评论 -
【剑指offer】表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","−123","3.1416"和"−1E−16""+100",&qu...原创 2019-04-11 12:20:25 · 98 阅读 · 0 评论 -
【剑指offer】正则表达式匹配
题目描述请实现一个函数用来匹配包括′.′'.'′.′和′∗′'*'′∗′的正则表达式。模式中的字符′.′'.'′.′表示任意一个字符,而′∗′'*'′∗′表示它前面的字符可以出现任意次(包含000次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例...原创 2019-04-11 12:06:09 · 205 阅读 · 0 评论 -
【剑指offer】左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROLROLROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列SSS,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdefabcXYZdefabcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabcXYZdefabcXYZdefabc”。是不是很简单?OKOKOK,搞定它!思...原创 2019-04-07 15:48:05 · 142 阅读 · 0 评论 -
【剑指offer】和为S的两个数字
题目描述输入一个递增排序的数组和一个数字SSS,在数组中查找两个数,使得他们的和正好是SSS,如果有多对数字的和等于SSS,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:类似于二分思想。一个startstartstart从头开始遍历,一个endendend从尾开始遍历。如果array[start]+array[end]>Sarray[s...原创 2019-04-07 15:41:58 · 103 阅读 · 0 评论 -
【剑指offer】和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9 169~169 16的和,他马上就写出了正确答案是100100100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100100100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,2218,19,20,21,2218,19,20,21,22。现在把问题交给你...原创 2019-04-07 15:28:17 · 69 阅读 · 0 评论 -
【剑指offer】数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:1)用一个multimapmultimapmultimap,遍历数组元素存入multimapmultimapmultimap,keykeykey为数值大小,valuevaluevalue为出现次数,然后遍历multimapmultimapmultimap,找出multimap[num[i...原创 2019-04-07 14:46:49 · 95 阅读 · 0 评论 -
【剑指offer】平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:首先了解平衡二叉树的概念,平衡是指对于任意一个节点其左子树的深度与右子树的深度差绝对值小于等于1。1)直接计算每一节点的左子树与右子树的深度,判断当前节点是否满足平衡二叉树的条件,如果满足,则递归判断下一节点是否满足。2)自下而上的方法判断,传递一个引用参数作为深度,减少计算深度次数。1)class Solution {p...原创 2019-04-07 14:31:10 · 74 阅读 · 0 评论 -
【剑指offer】二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:递归。预处理如果根节点为空,返回0;如果根节点不为空,其左右子节点为空,则返回1;再递归判断左子树与右子树的返回深度,取其最大值+1即为二叉树的深度/*struct TreeNode { int val; struct TreeNode *left; ...原创 2019-04-07 13:55:20 · 255 阅读 · 0 评论 -
【剑指offer】数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。思路:1)直接遍历整个数组,遇到该数字则加1,时间复杂度为O(n)O(n)O(n);2)利用二分搜索的思想。利用二分找到kkk在排序数组中第一次出现的位置frstkfrstkfrstk,再次利用二分找到kkk在排序数组中最后一次出现的位置lastklastklastk,则出现总次数为lastk−firstk+1lastk - firstk + 1...原创 2019-04-07 13:50:15 · 165 阅读 · 0 评论 -
【剑指offer】两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路:可以将它当成有环进行思考,让两链表同时从头节点开始遍历,如果某个链表遍历到末尾时,则从另一个链表的头节点开始遍历。两个指针最终一定会相等,从而跳出循环,而且只有两种情况,一种是在交点处相等,另一种是遍历到链表末尾相等。为什么说一定会相等呢?因为两个链表节点所走的路程恰好是两个链表的长度,所以一定会相等。/*struct ListNode...原创 2019-04-07 13:42:38 · 185 阅读 · 0 评论 -
【剑指offer】二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:题中给出要求,为中序遍历顺序,即左、根、右;如果给定节点存在右节点,则找到其右节点的最左节点即为下一个节点;如果不存在右节点,则寻找父节点是其父节点的左子节点,即如果还存在下一节点则该节点必须位于整棵树的左子树,若位于右子树则寻找不到上述要求的节点...原创 2019-04-11 14:59:59 · 102 阅读 · 0 评论 -
【剑指offer】对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:一颗二叉树是对称的,那么可以将其想象成是一个镜像的树,就像照镜子那样去思考判断。那么就很好用递归进行实现,首先判断如果左节点与右节点都为空,则返回truetruetrue,只要有一个不为空而另一个为空,则返回falsefalsefalse,在此基础上判断其值是否相等,相等...原创 2019-04-11 15:11:41 · 96 阅读 · 0 评论 -
【剑指offer】数组中重复的数字
题目描述在一个长度为nnn的数组里的所有数字都在000到n−1n-1n−1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为777的数组2,3,1,0,2,5,3,4{2,3,1,0,2,5,3,4}2,3,1,0,2,5,3,4,那么对应的输出是第一个重复的数字222。思路:1)...原创 2019-04-09 22:42:28 · 108 阅读 · 0 评论 -
【剑指offer】机器人的运动范围
题目描述地上有一个mmm行和nnn列的方格。一个机器人从坐标0,00,00,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于kkk的格子。 例如,当kkk为181818时,机器人能够进入方格(35,3735,3735,37),因为3+5+3+7=183+5+3+7 = 183+5+3+7=18。但是,它不能进入方格(35,3835,3835,...原创 2019-04-12 15:10:03 · 188 阅读 · 0 评论 -
【剑指offer】矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 aaa bbb ccc eee sss fff ccc sss aaa ddd eee eee 这样的3X43 X 43X4 矩阵中包含一条字符串"b...原创 2019-04-12 12:24:10 · 73 阅读 · 0 评论 -
【剑指offer】滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,12,3,4,2,6,2,5,12,3,4,2,6,2,5,1}及滑动窗口的大小333,那么一共存在666个滑动窗口,他们的最大值分别为{4,4,6,6,6,54,4,6,6,6,54,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,12,3,4,2,6,2,5,1...原创 2019-04-12 12:14:18 · 203 阅读 · 0 评论 -
【剑指offer】不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、−、∗、/+、-、*、/+、−、∗、/四则运算符号。思路:既然不能用四则运算,那么就只剩位运算了。首先两个整数异或得到不考虑进位的和sumsumsum,然后再进行与运算左移一位即可得到进位carrycarrycarry,然后再把sumsumsum作为num1num1num1,carrycarrycarry作为num2num2num2...原创 2019-04-08 23:18:10 · 70 阅读 · 0 评论 -
【剑指offer】数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()Insert()Insert()方法读取数据流,使用GetMedian()GetMedian()GetMedian()方法获取当前读取数据的中位数。思路:可以采用大顶堆、小顶堆来...原创 2019-04-12 11:58:22 · 66 阅读 · 0 评论 -
【剑指offer】二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k大的结点。例如, (5,3,7,2,4,6,85,3,7,2,4,6,85,3,7,2,4,6,8) 中,按结点数值大小顺序第三大结点的值为444。思路:如上图中的二叉树,我们对其进行中序遍历,得到结果{1,3,4,6,7,8,10,13,141,3,4,6,7,8,10,13,141,3,4,6,7,8,10,13,14},可以发现这个结...原创 2019-04-12 11:30:20 · 70 阅读 · 0 评论 -
【剑指offer】求1+2+3+...+n
题目描述求1+2+3+...+n1+2+3+...+n1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、casefor、while、if、else、switch、casefor、while、if、else、switch、case等关键字及条件判断语句(A?B:CA?B:CA?B:C)。思路:递归,利用虚函数求解。运行时识别调用哪个函数,其中一个函数实...原创 2019-04-08 13:12:11 · 155 阅读 · 0 评论 -
【剑指offer】孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数mmm,让编号为000的小朋友开始报数。每次喊到m−1m-1m−1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m−10.....原创 2019-04-08 11:48:09 · 112 阅读 · 0 评论 -
【剑指offer】序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路:原创 2019-04-11 17:41:24 · 66 阅读 · 0 评论 -
【剑指offer】扑克牌顺子
题目描述LLLLLL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有222个大王,222个小王(一副牌原本是545454张_)…他随机从中抽出了555张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心AAA,黑桃333,小王,大王,方片555”,“OhMyGod!Oh My God!OhMyGod!”不是顺子…LLLLLL不高兴了,他想了想,决定大...原创 2019-04-08 11:33:34 · 106 阅读 · 0 评论 -
【剑指offer】把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:层次遍历。记录当前层的节点个数nodesnodesnodes与下一层节点的个数nextlevelnextlevelnextlevel,当访问某一节点时,将该节点的左右子节点都存入栈中(nextlevel++nextlevel++nextlevel++),并记录存入栈中节点的数量,访问该节点结束后,−−nodes--n...原创 2019-04-11 15:38:29 · 83 阅读 · 0 评论 -
【剑指offer】按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:采用两个栈,交换进行存储,000栈存储奇数层,111栈存储偶数层;当某个栈在打印该层的节点时,将下一层的节点存入另一个栈中,当为000栈时,为奇数层,顺序将下一层的节点存入111栈中,这样当访问111栈时便是先访问右节点后访问左节点;当为...原创 2019-04-11 15:31:48 · 73 阅读 · 0 评论 -
【剑指offer】数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数PPP。并将PPP对100000000710000000071000000007取模的结果输出。 即输出PP%1000000007P输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=104size<...原创 2019-04-07 13:00:04 · 135 阅读 · 0 评论 -
【剑指offer】第一个只出现一次的字符
题目描述在一个字符串(0<=0<=0<=字符串长度<=10000<=10000<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 −1-1−1(需要区分大小写).思路:用hashmaphashmaphashmap存储字符,keykeykey为字符,valuevaluevalue为出现...原创 2019-04-06 12:10:19 · 100 阅读 · 0 评论 -
【剑指offer】丑数
题目描述把只包含质因子2、3和52、3和52、3和5的数称作丑数(UglyUglyUgly NumberNumberNumber)。例如6、86、86、8都是丑数,但141414不是,因为它包含质因子777。 习惯上我们把111当做是第一个丑数。求按从小到大的顺序的第NNN个丑数。思路:因为丑数只包含2,3,52,3,52,3,5质因子,那么我们要求第NNN个丑数,即可以从第111个丑数开始,...原创 2019-04-06 10:31:44 · 3731 阅读 · 0 评论 -
【剑指offer】二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5分析:首先判断如果根节点为空,则不用更改;如果左右子树同时为空,也不用更改;然后根据...原创 2019-03-24 20:20:06 · 65 阅读 · 0 评论 -
【剑指offer】树的子结构
题目描述输入两棵二叉树A,BA,BA,B,判断BBB是不是AAA的子结构。(pspsps:我们约定空树不是任意一个树的子结构)个人思路:首先两棵树不能为空,如果为空则直接返回falsefalsefalse;然后寻找第一个值相等的节点,如果未找到,则遍历AAA的左子树与右子树,如果找到相等的节点,则继续深层判断是否对应BBB树中的每一个节点值都相等/*struct TreeNode { i...原创 2019-03-24 20:12:55 · 69 阅读 · 0 评论 -
【剑指offer】合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。个人思路:比较两个链表当前节点值的大小,若哪个链表节点值更小,则加入新建链表,同时链表指向下一节点。由这种想法,可以得出递归与非递归版本,其思想大同小异递归:/*struct ListNode { int val; struct ListNode *next; Li...原创 2019-03-24 20:02:19 · 63 阅读 · 0 评论 -
【剑指offer】反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。个人思路:定义一个新节点为反转后的链表表头pReverseHeadpReverseHeadpReverseHead,一个节点为当前遍历的节点pNodepNodepNode,另一个节点为反转链表的指向前驱pPrevpPrevpPrev;然后遍历该链表,当当前节点pNodepNodepNode的下一节点为空时,则说明当前节点为反转链表的头;如不为...原创 2019-03-24 19:55:29 · 102 阅读 · 0 评论 -
【剑指offer】链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第kkk个结点。个人思路:让一个指针先走k−1k - 1k−1步,到达第kkk个节点,然后第二个指针指向头节点,让两个指针同时出发,当第一个指针到达节点末尾时,此时第二个指针刚好指向倒数第kkk个节点(两个指针相差的距离一直为kkk,所以当第一个指针指向链表末尾时,第二个指针则指向倒数第kkk个节点)/*struct ListNode { int ...原创 2019-03-24 19:39:09 · 65 阅读 · 0 评论 -
【剑指offer】调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。个人思路:开辟一个vectorvectorvector数组,先遍历一遍将数组中奇数存入vectorvectorvector,然后再次遍历将偶数存入vectorvectorvector,再将vectorvectorvect...原创 2019-03-24 19:31:47 · 74 阅读 · 0 评论 -
【剑指offer】数值的整数次方
题目描述给定一个doubledoubledouble类型的浮点数basebasebase和intintint类型的整数exponentexponentexponent。求basebasebase的exponentexponentexponent次方。分析:主要考查对于细节的把握。当basebasebase为000时,当幂数exponentexponentexponent为000或者负数时无意义...原创 2019-03-24 19:22:54 · 88 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中111的个数。其中负数用补码表示。分析:把一个整数减去111后与它本身相与,会把这个整数二进制表述中最右边的111去掉。例:444的二进制表示为100100100, 减去111后为333,二进制表示为011011011,相与之后变为000000000,则最右边的111被消除;同时还可以举个负数的例子,比如−5-5−5,其用补码表示为001100110...原创 2019-03-24 18:59:56 · 66 阅读 · 0 评论