
剑指Offer
文章平均质量分 95
昂昂累世士
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
AcWing 22 旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例输入:nums=[2,2,2,0,1]输出:0分析:对这题的第一眼印象是单峰向...原创 2019-03-03 21:56:35 · 232 阅读 · 0 评论 -
AcWing 34 链表中环的入口结点
题目描述:给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.分析:很有意思的题目。难点在于我们无法像遍历图结点那样设置标志数组,第一次访问到已经访问过...原创 2019-03-06 16:07:08 · 281 阅读 · 0 评论 -
AcWing 33 链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点。注意:k >= 0; 如果k大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4分析:两种思路:第一种是先遍历一遍求出链表长度,然后第二次遍历访问第n-k+1个结点。第二种思路则是使用双指针,只遍历一遍单链表。下面采用第二种思路解决,指针...原创 2019-03-06 15:04:26 · 130 阅读 · 0 评论 -
AcWing 32 调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]分析:类似于快速排序的思想,定义首尾两个指针,首指针移动到了偶数则停留,尾指针移动到了奇数则停留,交换两个指针指向的元素,然后继续循环,知道p不小于q为止。注意:交换操作前...原创 2019-03-06 14:47:31 · 127 阅读 · 0 评论 -
AcWing 31 表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。注意:小数可以没有整数部分,例如.1原创 2019-03-06 14:27:31 · 117 阅读 · 0 评论 -
AcWing 21 斐波那契数列
题目描述:输入一个整数 n ,求斐波那契数列的第 n项。假定从0开始,第0项为0。(n<=39)样例输入整数 n=5返回 5(PS:本来这么简单的题不用写题解,强迫症逐题做,还是写下吧)。分析:方法一:一般的递归写法:时间复杂度比较难推导,邓公习题集上有推导。class Solution {public: int Fibonacci(in...原创 2019-03-03 17:42:50 · 377 阅读 · 0 评论 -
AcWing 20 用两个栈实现队列
题目描述:请用栈实现一个队列,支持如下四种操作:push(x) – 将元素x插到队尾; pop() – 将队首的元素弹出,并返回该元素; peek() – 返回队首元素; empty() – 返回队列是否为空;注意:你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty; 如果你选择的编程语言没有栈的标准库,你可以...原创 2019-03-03 17:17:05 · 201 阅读 · 0 评论 -
AcWing 19 二叉树的下一个节点
题目描述:给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点; 二叉树一定不为空,且给定的节点一定不是空节点;样例假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。解释:该二叉树的结构如下,2的后继节点是3。 2/ ...原创 2019-03-03 16:51:25 · 227 阅读 · 0 评论 -
AcWing 48 复杂链表的复刻
题目描述:请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。分析:可以用哈希表来将原链表来映射到新的链表,也可以不用hash,采用一种新的方式解决。设原链表为abcdef,我们在每个结点后面插入新的结点,其值和前面结点一致。得到aAbBcCdDeEfF。然后比如a的random指向d,我们就...原创 2019-03-08 17:19:07 · 328 阅读 · 0 评论 -
AcWing 18 重建二叉树
题目描述:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同; 输入的前序遍历和中序遍历一定合法;样例给定:前序遍历是:[3, 9, 20, 15, 7]中序遍历是:[9, 3, 15, 20, 7]返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]返回的二叉树如下...原创 2019-03-03 16:14:59 · 174 阅读 · 0 评论 -
AcWing 47 二叉树中和为某一值的路径
题目描述:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。样例给出二叉树如下所示,并给出num=22。 5 / \ 4 6 / / \ 12 13 6 / \ / \9 1 5 1输出:[[5,4,12,1],[5,6,...原创 2019-03-08 16:00:54 · 167 阅读 · 0 评论 -
AcWing 30 正则表达式匹配
题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。样例输入:s="aa"p="a*"输出:tr原创 2019-03-06 09:58:01 · 242 阅读 · 0 评论 -
AcWing 17 从尾到头打印链表
题目描述:输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回的结果用数组存储。样例输入:[2, 3, 5]返回:[5, 3, 2]分析:简单的链表题,需要注意的是两点。其一是循环的判断条件是head != NULL而不是head->next!=next;其二是vector的反向迭代器。摘抄一下网上的定义:反向迭代器是一种反向遍历容器的迭代器。也就是,从最...原创 2019-03-03 09:28:03 · 177 阅读 · 0 评论 -
AcWing 16 替换空格
题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。你可以假定输入字符串的长度最大是1000。注意输出字符串的长度可能大于1000。样例输入:"We are happy."输出:"We%20are%20happy."分析:简单题,可能题目本意是想让我们先分配内存,再替换空格,但是c++里string不用我们动态的去分配内存。class Solution...原创 2019-03-03 09:05:38 · 195 阅读 · 0 评论 -
AcWing 15 二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例输入数组:[ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15]]如果输入查找数值为7,则返回true,如果输入查找数值为5,则返...原创 2019-03-01 22:42:21 · 149 阅读 · 0 评论 -
AcWing 14 不修改数组找出重复的数字
题目描述:给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。请找出数组中任意一个重复的数,但不能修改输入的数组。样例:给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。分析:本题与上题相比有些变化,一方面是数的个数与范围改变了,另一方面要求不能改变输入的数组,当然我们可以备份一下原数组,然后...原创 2019-03-01 21:55:25 · 361 阅读 · 3 评论 -
AcWing 62 丑数
题目描述:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。求第n个丑数的值。样例输入:5输出:5注意:习惯上我们把1当做第一个丑数。分析:方法一:打表备查,将每个已经判断的丑数保存进哈希表,如果某数能被2,3,5之一整除且商为丑数,则该数为丑数。该方法缺点是内存消耗太大,超过了限制。如果...原创 2019-03-13 21:15:09 · 209 阅读 · 0 评论 -
AcWing 63 字符串中第一个只出现一次的字符
题目描述:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回#字符。样例:输入:"abaccdeff"输出:'b'分析:简单的哈希问题,第一遍扫描统计各个元素个数,第二次扫描找到解。class Solution {public: char firstNotRepeatingCh...原创 2019-03-13 21:27:36 · 126 阅读 · 0 评论 -
AcWing 29 删除链表中重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。样例1输入:1->2->3->3->4->4->5输出:1->2->5样例2输入:1->1->1->2->3输出:2->3分析:本题与一般去重不同之处是:对于重复的元素,一个不留。于是很可...原创 2019-03-04 16:08:25 · 181 阅读 · 0 评论 -
AcWing 50 序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"注意:以上的格...原创 2019-03-09 21:11:05 · 152 阅读 · 0 评论 -
AcWing 39 对称的二叉树
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树: 1 / \ 2 2 / \ / \3 4 4 3如下图所示二叉树[1,2,2,null,4,4,3...原创 2019-03-07 09:58:08 · 113 阅读 · 0 评论 -
AcWing 38 二叉树的镜像
题目描述:输入一个二叉树,将它变换为它的镜像。样例输入树: 8 / \ 6 10 / \ / \ 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / \ 10 6 / \ / \ 11 9 7 ...原创 2019-03-07 09:17:22 · 128 阅读 · 0 评论 -
AcWing 37 树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例树A: 8 / \ 8 7 / \ 9 2 / \ 4 7树B: 8 / \ 9 2返回 true ,因为B是A的子结构。分析:本题考察二叉树的匹配,用类似于字符串匹配一样暴力的方法逐一比较,...原创 2019-03-07 08:56:39 · 157 阅读 · 0 评论 -
AcWing 28 在O(1)时间删除链表结点
题目描述:给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。样例输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节点为第0个节点)输出:新链表 1->4->8分析:常规单链表删除操作,不知道前驱结点,无法在O(1)时间内完成删除操作。我们采用这样的方法...原创 2019-03-04 15:02:21 · 207 阅读 · 0 评论 -
AcWing 27 数值的整数次方
题目描述:实现函数double Power(double base, int exponent),求base的 exponent次方。不得使用库函数,同时不需要考虑大数问题。注意:不会出现底数和指数同为0的情况样例1输入:10 ,2输出:100样例2输入:10 ,-2 输出:0.01分析:简单题。class Solution {pub...原创 2019-03-04 14:54:18 · 174 阅读 · 0 评论 -
AcWing 26 二进制中1的个数
题目描述:输入一个32位整数,输出该数二进制表示中1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9输出:2解释:9的二进制表示是1001,一共有2个1。样例2输入:-2输出:31解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。分析:方法一:对负数单...原创 2019-03-04 14:44:26 · 272 阅读 · 0 评论 -
AcWing 49 二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。分析:题目要求我们将BST的中序遍历序列练成一个双向链表。可以看见,BST的垂直投影恰好就是有序的,对于链表中任一个结点,其前驱结点就是中序序列的前一...原创 2019-03-09 17:04:21 · 175 阅读 · 0 评论 -
AcWing 36 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5分析:归并排序的合并算法。/** * Definition for singly-linked list. * struct ListNo...原创 2019-03-06 22:14:43 · 144 阅读 · 0 评论 -
AcWing 25 剪绳子
题目描述:给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。样例输入:8输出:18分析:直接暴搜的话复杂度太高。对于长度为n...原创 2019-03-04 11:51:41 · 228 阅读 · 0 评论 -
AcWing 24 机器人的运动范围
题目描述:地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 k的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484...原创 2019-03-04 10:50:57 · 327 阅读 · 0 评论 -
AcWing 35 反转链表
题目描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL分析:方法一:头插法,实在汗颜,因为单链表操作简单所以当初没认真思考每个知识点,导致写个头插法半天找不到错误。开始我这样写q = ...原创 2019-03-06 21:42:21 · 139 阅读 · 0 评论 -
AcWing 67 数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。样例输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3输出:4分析:方法一:直接遍历很简单的查找题目。遍历到k时开始计数,遍历到其他数时计数截止。时间复杂度为O(n)。class S...原创 2019-03-14 12:25:44 · 142 阅读 · 0 评论 -
AcWing 66 两个链表的第一个公共结点
题目描述:‘输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。样例给出两个链表如下所示:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3输出第一个公共节...原创 2019-03-14 10:42:35 · 172 阅读 · 0 评论 -
AcWing 65 数组中的逆序对
题目描述:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。样例输入:[1,2,3,4,5,6,0]输出:6分析:暴力做法,平方级复杂度,不予考虑。采用分治法优化,类似于归并排序的思路。假设merge函数可以返回一个区间内逆序对的个数,那么对于区间[l,r],我们划分为[l,mid]和[mid+...原创 2019-03-14 10:14:18 · 211 阅读 · 0 评论 -
AcWing 64 字符流中第一个只出现一次的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。如果当前字符流没有存在出现一次的字符,返回#字符。样例输入:"google"输出:"ggg#ll"解释:每当字符流读入一个字符,就进行一次判断并...原创 2019-03-14 09:15:40 · 176 阅读 · 0 评论 -
AcWing 13 找出数组中重复的数字
题目描述:给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在 0∼n−1的范围内,或数组中不包含重复数字,则返回 -1;样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 ...原创 2019-03-01 20:43:14 · 287 阅读 · 2 评论