![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
HaoRenkk123
love c++++++++++
展开
-
剑指offer第四十题:数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。 思路1:先排序,然后遍历整个数组,如果当前数和前边的数以及后边的数都不一样,那么当前数就是只出现了一次的数字,注意考虑边界(只出现一次的数可能在数组第一个也可能出现在数组最后一位)。 思路2:听说可以利用两个数字的逻辑异或来做,这里先只讨论第一种思路,第二种,刷完一遍剑指offer再回来...原创 2018-09-14 19:59:39 · 159 阅读 · 0 评论 -
剑指offer第二十九题:最小的k个数
题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路:要考虑边界情况,假如k>arr.size(),则要返回一个空的vector。对于k<=arr.size()的情况,则先排序,然后去排序后数组的前k个数。 代码: class Solution { public: vector<...原创 2018-09-07 09:56:23 · 113 阅读 · 0 评论 -
剑指offer第二十八题:数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路:这题第一想到的就是用哈希表,让每个数字作为表的键,该数字出现的次数作为键值,然后遍历整张表,判断键值shif是否大于arr.size()/2即可,直接上代码: cl...原创 2018-09-07 09:49:28 · 118 阅读 · 0 评论 -
剑指offer第二十七题:字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路:这里直接用c++的STL标准库中的next_permutation(),注意边界条件。 可以看看大神对于全排列总...原创 2018-09-06 16:07:31 · 178 阅读 · 0 评论 -
剑指offer第二十六题:二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路:暂时只知道用中序遍历,但是代码还写不出来,过段时间再来写。留个脚印。...原创 2018-09-06 16:00:31 · 142 阅读 · 0 评论 -
剑指offer第三十题:连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2018-09-08 13:16:21 · 139 阅读 · 0 评论 -
剑指offer第二十题:包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路:栈的弹出,压入,以及取上值这些都是基础知识,但是这里要求min值,第一反应是定义一个变量,每次压入点的时候和这个变量比较,要是比该变量小,则交换。但是考虑到栈有弹出操作,如果弹出的那个数把最小值弹出去了,那么剩下的栈当中的zu最小值就不得而知。 所以,最好的办法是建立一个辅...原创 2018-08-25 21:30:02 · 132 阅读 · 0 评论 -
剑指offer第十九题:顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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. 思路:(目前还没有)...原创 2018-08-25 21:24:24 · 103 阅读 · 0 评论 -
剑指offer第十八题:二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 ...原创 2018-08-25 17:49:27 · 121 阅读 · 0 评论 -
剑指offer第三十一题:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。 思路:分别求出n的个位、十位、百位、千位等等,每一位1出现的个数,然后...原创 2018-09-13 11:02:19 · 240 阅读 · 0 评论 -
剑指offer第三十二题:把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路:设计一个排序依据,实现数组内每个数的排序,好比普通数字排序。 代码: class Solution { public: string PrintMinNumber(vector<in...原创 2018-09-13 20:27:52 · 123 阅读 · 0 评论 -
剑指offer第三十九题:平衡二叉树
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 思路: 首先说明平衡二叉树的概念:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 剑指offer第三十八题是计算二叉树的深度,那么这里我们可以计算左子树和右子树的深度,再比较它们的差值,即可判断是否是平衡二叉树。 代码: class Solution { public: ...原创 2018-09-14 19:53:54 · 219 阅读 · 0 评论 -
剑指offer第四十一题:和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续正数...原创 2018-09-19 23:37:13 · 118 阅读 · 0 评论 -
剑指offer第三十八题:二叉树的深度
题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 思路:用递归,左右两个子树一直递归比较,取最大的值,就是深度。 代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int...原创 2018-09-14 16:22:20 · 143 阅读 · 0 评论 -
剑指offer第三十七题:数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数。 思路1:双子针法,头指针从头向后开始遍历查找,找到即退出到当前位置i,尾指针从尾部开始向前查找,找到即退出到当前位置j,最后两个指针的位置相减,再加1,得到的就是该查找的数字在数组中出现的次数。 思路2:顺序数组可以用二分查找,上面这种做法的时间复杂度为O(n)O(n),我们没有充分利用有序这个条件,有序序列的查找可以用二分来做,查找第一个数字...原创 2018-09-14 12:23:03 · 149 阅读 · 0 评论 -
剑指offer第三十六题:两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点。 思路:由于参数都是单链表,那么意味着遇到第一个公共结点后,后边的结点都是公共结点,用哈希set,将其中一个链表所有的结点先放入set中,然后遍历第二个链表,遍历的同时查找set,若查到,则当前结点即为第一个公共结点。 代码: /* struct ListNode { int val; struct ListNode *next; ...原创 2018-09-14 12:01:17 · 124 阅读 · 0 评论 -
剑指offer第三十五题:数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%1...原创 2018-09-14 11:57:02 · 216 阅读 · 0 评论 -
剑指offer第三十四题:第一个只出现一次的字符
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 思路:这题比较简单,直接用map。 代码: class Solution { public: int FirstNotRepeatingChar(string str) { map<ch...原创 2018-09-13 20:54:38 · 143 阅读 · 0 评论 -
剑指offer第三十三题:丑数
题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 思路:因数又叫约数,整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因数。 质数:质数,又叫“素数”,在大于1的自然数中,仅有1和本身为自己的因子的数叫素数...原创 2018-09-13 20:53:06 · 210 阅读 · 0 评论 -
剑指offer第十七题:树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:要判断一棵树是不是另一棵树的子树,那么子树肯定是另一个树的某一部分,子树的根节点起所有的叶节点也都与另一棵树的结构相同,对于二叉树,一般用递归。 首先,判断边界条件,两棵树都不能为NULL,否则返回false,然后寻找子树与另一棵树的相同的起点,并从起点结点处同时遍历 代码: /...原创 2018-08-25 17:04:38 · 126 阅读 · 0 评论 -
剑指offer第十二题:数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路:该题主要考边界went问题,A的n次方,边界有以下情况: 1:n为0时,任意数的n次方均为0 2:A为0时,n>0时,返回0ji即可,但是n<0时,则A^-1方为例,等于1/A,A不能为0,所以这种情况是错误的,返回false 3:A不为0时,...原创 2018-08-21 21:58:49 · 446 阅读 · 0 评论 -
剑指offer第十一题:二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路:考虑一个整数减去1的情况,可以分为如下两种情况讨论: 这个数最右边一位为1:减去1则最右边一位取反为0,其他位不变。 最后一位不是1而是0:假设该整数最右边的比特1位于第m位,那么减去1时,第m位由1变成0,而第m位后的所有0变成1,第m位之前的不变。 这两种情况可以概括为:把一个整数减去1,都是把最右...原创 2018-08-21 21:38:51 · 121 阅读 · 0 评论 -
剑指offer第八题:跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 思路:青蛙跳台阶可以有两种情况如下 1:第一种,最后一下跳了2格,那这种情况的最后一下的前边跳过的台阶数为number-2 2:第二种,最后一下跳了一格,那这种情况的最后一下的前边tiao跳过的台阶数为numbnumber-1 问题又可以划分为求跳台阶numb...原创 2018-08-19 21:35:20 · 133 阅读 · 0 评论 -
剑指offer第七题:斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 思路:斐波那契数列如下 0,1,1,2,3,5,8,13,21,34.... 可以看出基本规律为F(N) = F(N-1) + F(N-2) 这里提供两种做法递归和非递归 第一种递归: class Solution { public: int F...原创 2018-08-19 20:10:49 · 118 阅读 · 0 评论 -
剑指offer第六题:旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:旋转数字有一下几个特点 1:以最小数字为界限,左边的数组diz递增,右边的shu数组也是递增 ...原创 2018-08-19 19:52:19 · 103 阅读 · 0 评论 -
剑指offer第五题:用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路: 堆栈是先进后出,想象一下水桶,队列是先进先出,想象一下水管。如果用两个堆栈完成一个队列的操作,存储时用一个水桶就行,取出时,现将第一个水桶中的水取出一点倒入第二个水桶中,依次取出倒入,直至将第一个水桶的水全部倒入第二个水桶,然后对第二个水桶进行取值,这就可以满足队列的先进先出的规则。...原创 2018-08-19 15:33:47 · 168 阅读 · 0 评论 -
剑指offer第四题:重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路: 知道前序和中序遍历的结果是可以唯一确定一颗二叉树的,但是知道前序和后序遍历是不可以唯一确定一颗二叉树的。利用前序遍历第一个数字为根,用这个...原创 2018-08-19 14:32:01 · 172 阅读 · 0 评论 -
剑指offer第二十一题:栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路:当压入序列顺序为1,2,3,4,5,弹出序列为4,5,3,2,1时,可以理解...原创 2018-08-26 13:40:55 · 153 阅读 · 0 评论 -
剑指offer第三题:从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 思路:单向链表只能由前到后依次遍历,要想反过来存入数组中,可以利用vector<>容器的v.insert(v.begin(), val)函数,意味着从vector最前边插入数字 直接上代码: /** * struct ListNode { * int val; * str...原创 2018-08-16 20:49:30 · 114 阅读 · 0 评论 -
剑指offer第二题:替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路:由于有要求限制在一定的空间内,所以最好是不要新建一个字符串,这样容易越界,那么要想在原来的字符串上改动,那么只能从后往前依次改动,这样才不会覆盖原来的字符串 假设原字符串为 A B C D...原创 2018-08-16 20:26:02 · 195 阅读 · 0 评论 -
剑指offer第九题:变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路:在剑指fer第八题可知,f(n) = f(n-2)+f(n-1) 在此题中,f(n) = f(n-1) + f(n-2) + f(n-3) +...+ f(0) 同样f(n-1) = f(n-2) + f(n-3) + ...+...原创 2018-08-19 22:05:16 · 163 阅读 · 0 评论 -
剑指offer第十题:矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:这题和跳台阶有点类似 假设要覆盖的大矩形为: 如上所示,第一种情况就是最后一列是竖着覆盖的,那么f(n)...原创 2018-08-19 22:48:24 · 272 阅读 · 0 评论 -
剑指offer第二十五题:复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:假如这题没有随机指针,很好搞,问题是有了随机指针,如何在新建结点的时候令随机指针指向正确的位置?可以用一个map来映射原结点和对应的新结点,刚开始的时候不要管...原创 2018-08-28 22:35:11 · 125 阅读 · 1 评论 -
剑指offer第二十四题:二叉树中和为某一值的路径
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 思路:考点1:二叉树的层序遍历BFS(宽度优先搜索),用队列 考点2:二叉树的先,中,后序遍历DFS(深度优先搜索),用堆栈,本题考点为DFS 先序遍历二叉...原创 2018-08-28 20:16:54 · 217 阅读 · 0 评论 -
剑指offer第二十三题:二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:二叉搜索树的特点:左子树的所有结点小于根结点,右子数的所有结点大于根结点。二叉树的后序遍历为left right root,所以给定一个数组,判断left部分是不是全部小于root,然后判断right部分是不是全部大于root,如果满足条件...原创 2018-08-28 15:06:24 · 95 阅读 · 0 评论 -
剑指offer第十六题:合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:两个链表从头开始比较,将其中小的那个结点存入新链表中,然后将那个链表结点移动到下一位。 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NU...原创 2018-08-23 23:40:39 · 126 阅读 · 0 评论 -
剑指offer第十五题:反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 思路: 利用链表的头插法会得到反序的链表这一性质来做。 具体做法是:提取头结点,然后遍历链表,取出的每一个结点,用头插法插入头结点。 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL...原创 2018-08-23 22:37:35 · 126 阅读 · 0 评论 -
剑指offer第十四题:链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 思路: 第一种思路:先求出链表的种长度length,然后遍历到链表的length-k的地方,就是倒数第k个结点。 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ ...原创 2018-08-22 22:49:58 · 110 阅读 · 0 评论 -
剑指offer第十三题:调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路:最简单的思路就是,定义一个新的数组,依次遍历原来的数组,将奇数放在xi新数组前边,偶数放新数组后边。 代码: class Solution { public: void reOrderArr...原创 2018-08-22 21:30:59 · 104 阅读 · 0 评论 -
剑指offer第二十二题:从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路:考察二叉树的层序遍历,二叉树的先序遍历、中序遍历、以及后序遍历都是可以用栈,符合先进后出的打印法,所以可以用递归栈。但是层序遍历不同,只能用队列。 代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; ...原创 2018-08-26 23:21:59 · 121 阅读 · 0 评论