剑指Offer(第2版)
文章平均质量分 75
菜鸡的鼻祖
这个作者很懒,什么都没留下…
展开
-
刷题分类整理
数组面试题3:数组中重复的数字面试题4:二维数组中的查找面试题11. 旋转数组的最小数字面试题21:调整数组顺序使得奇数位于偶数前面面试题29:顺时针打印矩阵面试题39:数组中出现超过一半的数字面试题45:把数组排成最小的数面试题51:数组中的逆序对面试题53:数字在排序数组中出现的次数面试题56:数组中只出现一次的数字面试题57:和为s的数字链表面试题6:反转链表...原创 2020-02-13 14:49:36 · 521 阅读 · 0 评论 -
剑指Offer(第2版)——面试题67:把字符串转换成整数
题目将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。解题思路这道题需要对输入的不同情况考虑全面:指针是否为空指针,字符串是否为空字符串;字符串对于正负号的处理;输入值是否为合法值,即小于等于’9’,大于等于’0’;int为32位,需要判断是否溢出;使用错误标志,区分返回值为0时是合法值0输入还是非法值输入。代码...原创 2020-02-11 23:59:12 · 210 阅读 · 0 评论 -
剑指Offer(第2版)——面试题66:构建乘积数组
题目给定一个数组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]。不能使用除法。解题思路可以把B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1],看成A[0]×A[1]×…×A[i-1]和A[i+1]×…×A[n-2]×A[n-1]两部分的乘积;即通过...原创 2020-02-10 00:04:29 · 216 阅读 · 0 评论 -
剑指Offer(第2版)——面试题65:不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路首先分析十进制加法是如何做的:5+17=22只做各位相加不进位,此时得到的结果是12;计算进位值,个位数相加有进位,进位的值是10;(如果这一步的进位值为0,那么第一步得到的值就是最终结果);重复上述两步,只是相加的值变成上述两步的得到的结果12和10,得到22。接着分析二进制是否适用上述规...原创 2020-02-09 18:24:33 · 185 阅读 · 0 评论 -
剑指Offer(第2版)——面试题64:求1+2+…+n
题目求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字即条件判断语句(A?B:C)解题思路思路1:递归法(特殊) 一般递归函数需要用 if 语句或者条件判断语句来判断是继续递归下去还是终止递归,但是题目限制无法使用,可以考虑别的方式来代替递归终止条件(比如&&)思路2:构造函数 我们可以先定义一个类型,接着创建n...原创 2020-02-09 17:11:57 · 142 阅读 · 0 评论 -
剑指Offer(第2版)——面试题63:股票的最大利润
题目假设把某股票的价格按照时间先后顺序储存在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16的时候卖出,则能收获最大的利润11。解题思路在遍历数组时记录下遍历到某个节点能够买入的最低价格,即该节点前面所有数字的最小值;则可以算出在当前节点价位卖出时可能得到的最大...原创 2020-02-08 12:48:12 · 192 阅读 · 0 评论 -
剑指Offer(第2版)——面试题62:圆圈中最后剩下的数字
题目0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里面删除第m个数字。求出这个圆圈里剩下的最后一个数字。解题思路思路1:环形链表模拟圆圈本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形链表。我们可以创建一个共有n个节点的环形链表,然后每次从这个链表中删除第m个节点。但是重...原创 2020-02-08 01:35:45 · 252 阅读 · 0 评论 -
剑指Offer(第2版)——面试题61:扑克牌中的顺子
题目从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。解题思路可以总结5张牌是顺子应满足的条件:数组长度必须为5;除0外没有重复的牌(0表示大小王);顺子中最大值和最小值的差值小于5(不包括0)。代码class Solution{public: bool IsCon...原创 2020-02-07 19:04:38 · 190 阅读 · 0 评论 -
剑指Offer(第2版)——面试题59:滑动窗口的最大值
题目1给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}。解题思路可以使用一个两端开口的队列(用STL中的deque来实现),用来保存有可能是滑动窗口最大值的数字的下标。接下来我们以数组{2,3,4,2,6,2,5,1}为例,来细说整体思...原创 2020-02-04 18:34:30 · 235 阅读 · 0 评论 -
剑指Offer(第2版)——面试题58:翻转字符串
题目1输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。解题思路第一步翻转句子中所有的字符,例如l“I am a student.”翻转为“.tneduts a ma I”;第二步再翻转每个单词中字符的顺序,得到最后的结果。代码class...原创 2020-01-17 12:58:55 · 139 阅读 · 0 评论 -
剑指Offer(第2版)——面试题57:和为s的数字
题目1输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出两个数的乘积最小的。解题思路对于一个数组,我们可以定义两个指针:一个从左往右遍历(pleft),另一个从右往左遍历(pright);首先,我们比较第一个数字和最后一个数字的和curSum与给定数字sum,如果curSum = sum,那么这两个数字就是我们要找的数字;如果c...原创 2020-01-16 22:35:31 · 154 阅读 · 0 评论 -
剑指Offer(第2版)——面试题56:数组中只出现一次的数字
题目一个整型数组里除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路:大家首先想到的是顺序扫描法,但是这种方法的时间复杂度是O(n^2)。接着大家又会考虑用哈希表的方法,但是空间复杂度不是O(1)。应该怎么做才能即满足时间复杂度是O(n)又满足空间复杂度是O(1)的要求呢?我们可以想一想“异或”运算的一个性质,...原创 2020-01-16 15:42:51 · 202 阅读 · 0 评论 -
剑指Offer(第2版)——面试题55:二叉树的深度
标题输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路可以用递归的方法实现,我们假设已经正确拿到了root节点左右子树的最大深度,那么最后加一即可:如果一棵树只有一个节点,那么它的深度为1;如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;如果根节点只有右子树而没有左子树,那么...原创 2020-01-15 11:49:30 · 145 阅读 · 0 评论 -
剑指Offer(第2版)——面试题54:二叉搜索树的第k大节点
题目给定一颗二叉搜索树,请找出其中的第k大的节点。例如,在下图二叉搜索树里,按节点数值大小顺序,第三大节点的值为4。解题思路这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子节点的值 < 根节点的值 < 右子节点的值。如果按照中序遍历的顺序遍历一棵二叉搜索树,则遍历序列的数值是递增排序的。如上图所示,如果使用中序遍历,则得到的序列是{2,3,4,5,6,7,8}。...原创 2020-01-14 12:43:27 · 173 阅读 · 0 评论 -
剑指Offer(第2版)——面试题53:数字在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数。解题思路既然是已经排序好的数组,那么第一个想到的就是二分查找算法。做法就是使用二分法找到数字k在数组中出现的第一个位置,再利用二分法找到数字k在数组中出现的最后一个位置。时间复杂度为O(logn + logn),最终的时间复杂度为O(logn)。二分查找第一个k:先拿数组中间的数字和k作比较。如果数组中间的数字大于k,则说明k应该出现在中间位置的左...原创 2020-01-13 17:18:35 · 165 阅读 · 0 评论 -
剑指Offer(第2版)——面试题52:两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共结点。链表节点定义如下:struct ListNode { int m_nKey; ListNode* m_pNext;};解题思路首先我们分析有公共节点的两个链表有哪些特点:从链表节点的定义可以看出,这两个链表是单向链表。如果两个单向链表有公共的节点,那么这两个链表从某一节点开始,他们的next都指向同一个节点;...原创 2019-12-25 22:41:19 · 198 阅读 · 0 评论 -
剑指Offer(第2版)——面试题51:数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。解题思路思路1:暴力法 顺序扫描整个数组,每扫描到一个数字,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成一个逆...原创 2019-12-24 22:12:59 · 172 阅读 · 0 评论 -
剑指Offer(第2版)——面试题50:第一个只出现一次的字符
题目在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出‘b’。解题思路建立一个哈希表,定义哈希表的键值(Key)是字符,而值(Value)是该字符出现的次数。同时我们需要从头开始扫描字符串两次。第一次扫描字符串时,每扫描到一个字符,就在哈希表的对应项中把次数加1。第二次扫描时,每扫描到一个字符,就能从哈希表中得到该字符出现的次数。这样,第一个只出现一次的字符就是...原创 2019-12-18 22:33:34 · 155 阅读 · 0 评论 -
剑指Offer(第2版)——面试题49:丑数
题目我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路思路1:逐个判断最简单的思路就是逐个判断每个整数是不是丑数。因为丑数只能被2,3,5整除。也就是说,如果一个数能被2整除,就继续除以2;能被3整除,就继续除以3;能被5整除,就继续除以5。如果最后...原创 2019-12-15 12:13:41 · 131 阅读 · 0 评论 -
剑指Offer(第2版)——面试题48:最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含 ′a′ ~ ′z′ 的字符。例如,在字符串 “arabcacfr” 中,最长的不含重复字符的子字符串是 “acfr”,长度为4。解题思路:我们采用动态规划来求解,首先定义函数 f(i) 表示以第 i 个字符为结尾的不包含重复字符的最大子字符串长度。如果第 i 个字符,在前 i-1 个字...原创 2019-12-12 23:08:29 · 197 阅读 · 0 评论 -
剑指Offer(第2版)——面试题47:礼物的最大价值
题目:在一个 m×n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿走多少价值的礼物?例如:现在有一个如下的棋盘,在这个棋盘中,按照(1,12,5,7,7,16,5)的顺序可以拿到总价值最大的礼物。解题思路:1.递归我们首先使...原创 2019-12-10 22:00:48 · 274 阅读 · 0 评论 -
剑指Offer(第2版)——面试题45:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组{3,32,321},则打印出这3个数字能排成的最小数字为321323。思路:我们自己定义一个排序规则,对拼接后的字符串进行比较。两个数字a,b能拼接成数字 ab 和 ba:若ab > ba 则 a 大于 b;若ab < ba 则 a 小于 b若ab = ba ...原创 2019-12-09 10:44:47 · 145 阅读 · 0 评论 -
剑指Offer(第2版)——面试题43:1~n 整数中1出现的次数
题目:输入一个整数n,求从1~n这n个整数的十进制表示中1出现的次数。例如,输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。解题思路:...原创 2019-12-08 20:23:51 · 138 阅读 · 0 评论 -
剑指Offer(第2版)——面试题42:连续子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。解题思路:举例分析:下图是我们计算数组(1,-2,3,10,-4,7,2,-5)中子数组的最大和的过程。通过分析我们发现:累加的子数组和,如果大于零,那么我们继续累加;否则,则需要剔除原来的累加和重新开始。过程如下:代码:...原创 2019-12-05 11:08:09 · 152 阅读 · 0 评论 -
剑指Offer(第2版)——面试题41:数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路:这道题的解法有很多,本文使用最大堆和最小堆实现。 我们将数据分为两部分,用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。左边最大堆的数据都比右边最小堆的数据要小,左、右两边内...原创 2019-12-04 11:24:05 · 124 阅读 · 0 评论 -
剑指Offer(第2版)——面试题40:最小的k个数
题目输入n个整数,找出其中最小的k个数。例如,输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路:思路1:快速排序最简单的方法就是把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,时间复杂度为O(nlogn)。思路2:Partiton分割:基于数组的第k个数字来调整,则使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所...原创 2019-12-03 13:48:59 · 121 阅读 · 0 评论 -
剑指Offer(第2版)——面试题39:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:思路1:数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此,我们可以考虑在遍历数组的时候保存两个值:一个是数组的...原创 2019-12-02 15:11:29 · 168 阅读 · 0 评论 -
剑指Offer(第2版)——面试题38:字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a, b, c所能排列出来的所有字符串abc, acb, bac, bca, cab和cba。解题思路:我们把一个字符串看成由两部分组成:第一部分是它的第一个字符,第二部分是后面的所有字符。求整个字符串的排列,可以看成两步:第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。下图...原创 2019-12-02 10:21:33 · 137 阅读 · 0 评论 -
剑指Offer(第2版)——面试题37:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。1.解题思路:根据前序遍历的顺序来序列化和反序列化二叉树。在遍历二叉树碰到NULL指针时,可以用$符号表示;节点之间可以用逗号隔开。2.代码:...原创 2019-11-29 15:25:34 · 244 阅读 · 0 评论 -
剑指Offer(第2版)——面试题28:对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。1.解题思路:前序遍历算法:先访问根节点,再访问左子节点,最后访问右子节点。对称前序遍历算法:先访问根节点,再访问右子节点,最后访问左子节点。如果二叉树的前序遍历序列和对称前序遍历序列是一样的,则说明二叉树是对称的。举例:遍历第一棵树,前序遍历的遍历序列为{8,6,5,7,6,7,...原创 2019-08-29 22:27:46 · 157 阅读 · 0 评论 -
剑指Offer(第2版)——面试题13:机器人的运动范围
题目:地上有一个m行和n列的方格。一个机器人从坐标(0,0)的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?1.解题思路:使用递归仍然使用布尔值...原创 2019-06-25 22:12:32 · 142 阅读 · 0 评论 -
剑指Offer(第2版)——面试题36:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。原创 2019-09-19 21:57:14 · 232 阅读 · 0 评论 -
剑指Offer(第2版)——面试题35:复杂链表的复制
题目:请实现函数 ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext 指针指向下一个节点,还有一个m_pSibling 指针指向链表中的任意节点或者nullptr。...原创 2019-09-09 21:58:23 · 160 阅读 · 0 评论 -
剑指Offer(第2版)——面试题18:删除链表中重复的节点
题目:在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。1.解题思路:三指针法:删除重复节点,只需要记录当前节点之前的最晚访问过的不重复节点pPre、当前节点pCur、指向当前节点之后节点pNext的三个指针即可。如...原创 2019-08-14 18:06:14 · 141 阅读 · 0 评论 -
剑指Offer(第2版)——面试题16:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。1.解题思路:当指数为正数时,直接循环连乘即可。当指数为负数时,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。(如果底数为0,0的负数次方是非法的,我们可以通过返回值、全局变量和异常这三种方法来反馈这种情况,这里使...原创 2019-07-24 20:04:18 · 161 阅读 · 0 评论 -
剑指Offer(第2版)——面试题15:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。1.解题思路:...原创 2019-07-16 21:48:04 · 169 阅读 · 0 评论 -
剑指Offer(第2版)——面试题11:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。1.解题思路: 我们注意到旋转之后的数组实际上可以划分为两个排序的字数组,而且前面的字数组的元素大于或者等于后面字数组的元素。我们还注意到最小的元素刚好是这两个字数组的分界...原创 2019-06-24 19:37:25 · 118 阅读 · 0 评论 -
剑指Offer(第2版)——面试题10:斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列公式为:1.解题思路:使用递归的方法是最简单的,但是效率成问题,有很多重复的计算。其实就是一种自顶向下的思想。使用自底向上的思想,从n=2开始计算,并且每次保存前面两次计算的结果,以此进行下一次计算,这样就不会有重复的计算。复杂度为O(n)。2.代码:class Solution {...原创 2019-06-23 11:44:37 · 216 阅读 · 0 评论 -
剑指Offer(第2版)——面试题9:用两个栈实现队列
题目:用两个栈实现一个队列。拓展题目:用两个队列实现一个栈。原创 2019-06-23 10:38:33 · 154 阅读 · 0 评论 -
剑指Offer(第2版)——面试题12:矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如,在下面的3x4的矩阵中包含一条字符串"bcced"的路径。但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路...原创 2019-06-25 19:56:43 · 155 阅读 · 0 评论