![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
四叶草姚
好好学习,好好休息
展开
-
剑指offer之二叉树的深度
1.题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2.问题分析方法一:可以使用递归的方法,分别求左子树和右子树的深度,则树的深度是:更大者 + 1。这是一个递归的方法。方法二:使用层次遍历的方法,每访问一层,则深度+1,所有层的访问结束之后,就等到深度了。这里需要使用到一个队列,来帮助我们层次遍历,...原创 2018-10-17 20:33:33 · 166 阅读 · 0 评论 -
剑指offer之表示数值的字符串
1.题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。2.问题分析其实问题不是很复杂,只是需要考虑完整,需要对每一个字符进行判断,判断是否是数字,是否是逗号,是否是字符’e’或者’E原创 2018-10-18 23:09:39 · 408 阅读 · 2 评论 -
剑指offer之构建乘积数组
1.题目描述给定一个数组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]。不能使用除法。2.问题描述假设:// 1 a2 a3 a4// a1 1 a3 a4// a1 a2 1 a4// a1 a2 a3 1可以看出来,这个数组B分成两部分,分别是左下角...原创 2018-10-18 22:03:27 · 145 阅读 · 0 评论 -
剑指offer之扑克牌顺子
1.题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的...原创 2018-10-18 18:15:34 · 182 阅读 · 0 评论 -
剑指offer之左旋转字符串
1.题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!2.问题分析题目简单,但是我们需要注意:第一,n如果n的长度大于字符串的长度,我们需要求余,...原创 2018-10-18 16:12:25 · 141 阅读 · 0 评论 -
剑指offer之数组中只出现一次的数字
1.题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。2.问题分析方法一:可以使用map,统计每个数出现的次数,之后对两个出现一次的数进行赋值方法二:这里就数字的特性,首先我们需要知道:两个相同的数异或后值为0。可以用位运算实现,如果将所有所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或的结果,所以根据异或的结果1...原创 2018-10-18 14:31:31 · 162 阅读 · 0 评论 -
剑指offer之替换空格
1.题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2.问题分析修改字符串的几个注意点:如果字符串是内存中的常量区,我们使不允许修改的;修改字符串我们要主要字符串的长度问题,不要越界;字符串后面有一个’\0’标识符,我们需要复制。程序的分析在代码注释里面,看源代码...原创 2018-10-15 10:50:48 · 174 阅读 · 0 评论 -
剑指offer之平衡二叉树
1.题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。2.问题分析什么是平衡二叉树?平衡二叉搜索树(Self-balancing binary searchtree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。根据平衡二叉树的定义,我们可以知道,平衡二叉树也是一个递归定义。我们...原创 2018-10-18 09:51:19 · 134 阅读 · 0 评论 -
剑指offer之二维数组中的查找
1. 问题描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.问题分析方法一:每行每列的查找每个数字,有点简单,但是没有效率;方法二:根据二维数组的特性,可以选择从右上角或者左下角的元素做比较。例如:1 2 3 (4)2 3 4 5...原创 2018-10-14 09:47:42 · 103 阅读 · 0 评论 -
C++之约瑟夫环
1.题目描述0,1,2,3,…,n-1这n个数排成一个圈,从数字0开始,每次在圆圈里面剔除第m个数字。求出这个圆圈最后一个数字。2.方法一个是使用链表来模拟这个过程使用公式推导3.代码链表模拟:int LastRemaining_Solution(int n, int m){ if(n==0 || m==0) return -1; list<...原创 2018-09-26 21:40:44 · 1042 阅读 · 0 评论 -
剑指offer之二叉搜索树与双向链表
1.问题描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。节点的结构体:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(...原创 2018-09-12 17:19:32 · 116 阅读 · 0 评论 -
剑指offer之用两个栈实现队列
1.题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。2.问题分析这个问题可以参考两个队列实现一个栈,思想是一样的。需要分析一下什么时候Push和Pop,那个队列Push,那个队列Pop:入队:将元素进栈A出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;如果不为空,栈B直接出栈。3.源代码class...原创 2018-10-16 15:32:21 · 106 阅读 · 0 评论 -
剑指offer之树的子结构
1.题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};2.问题描述...原创 2018-10-16 16:16:16 · 111 阅读 · 0 评论 -
剑指offer之统计一个数字在排序数组中出现的次数。
1.题目描述统计一个数字在排序数组中出现的次数。2.问题分析方法一:因为是排序的数组,首先在数组中找到第一个值为k的位置begin,之后从begin找下一个不等于值k的位置end,则,次数为end - begin。例如:1 2 2 3 3 3 5,k = 3,则begin = 3,end = 6,则次数是 end - begin = 3.方法二:因为是排序的数组,通过二分查找法查...原创 2018-10-17 20:07:20 · 332 阅读 · 0 评论 -
剑指offer之第一个只出现一次的字符
1.题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).2.问题分析第一次遍历,统计每个字符串出现的次数;第二次遍历,如果有那个字符出现次数为1,则返回该字符的位置,反之返回-1.3.源代码int FirstNotRepeatingChar(string str)...原创 2018-10-17 16:37:51 · 122 阅读 · 0 评论 -
剑指offer之数组中出现次数超过一半的数字
1.题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2.问题分析方法一:使用map,统计每个数字的次数,之后查找是否有次数超过数组长度的一半的数字;如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。...原创 2018-10-17 11:34:35 · 123 阅读 · 0 评论 -
剑指offer之机器人的运动范围
1.题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?2.问题分析这也是一个回溯问题,可以借...原创 2018-10-19 21:10:29 · 209 阅读 · 0 评论 -
剑指offer之矩阵中的路径
1.题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为...原创 2018-10-19 20:43:09 · 176 阅读 · 0 评论 -
剑指offer之二叉搜索树的第k个结点
1.题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。2.问题分析因为是二叉搜索树,那么中序遍历的结果就是从小到大,所以结点数值大小第k小,就是中序遍历的第k个。例如:(5,3,7,2,4,6,8),中序遍历就是(2,3,4,5,6,7,8),所以第3小,就是第3个数,即:4。3.源代码void...原创 2018-10-19 19:41:31 · 176 阅读 · 0 评论 -
剑指offer之序列化二叉树
1.题目描述请实现两个函数,分别用来序列化和反序列化二叉树。两个函数分别是:char* Serialize(TreeNode *root) { }TreeNode* Deserialize(char *str) { }2.问题分析系列化和反系列化都应该是一样的遍历方式,或者前序遍历或者中序遍历或者后序遍历。但是为了方便,我们使用前序遍历,第一个字符...原创 2018-10-19 16:26:08 · 360 阅读 · 0 评论 -
剑指offer之二叉搜索树的后序遍历序列
1.题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2.问题分析什么是二叉搜索树?根据定义,二叉查找树(Binary SearchTree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右...原创 2018-10-16 22:43:21 · 104 阅读 · 0 评论 -
剑指offer之二叉树的下一个结点
1.题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.问题分析3.源代码// 例如: 1// 2 3// 4 6 7// 中序遍历是 4 2 1 6 3 7我们分成两种情况:一种是:该节点的右子树不为空,查找该右子树的中序遍历的第一个节点,即:最左...原创 2018-10-19 13:26:56 · 152 阅读 · 0 评论 -
剑指offer之顺时针打印矩阵
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.问题分析因为是顺时针打印,所以每次我们打印矩阵最外围一圈,之后矩阵缩小一圈,重复上述过程,打印完毕。打印一圈...原创 2018-10-16 17:24:25 · 90 阅读 · 0 评论 -
剑指offer之复杂链表的复制
1.题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)节点的结构体:struct RandomListNode { int label; struct RandomListNode *next, *r...原创 2018-09-12 17:07:56 · 121 阅读 · 0 评论 -
剑指offer之字符串的排序
1.题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。2.分析1.如果字母都是不同的,那么输出的字符串数量应该是n!,所以如果有三个不同字母,那么就有3*2*1...原创 2018-09-12 16:58:06 · 203 阅读 · 0 评论 -
剑指offer之链表中环的入口结点
1.题目描述一个链表中包含环,如何找出环的入口结点?例如,在下图的链表中,环的入口结点是结点3。 2.分析先找一个环中的节点,通过两个指针,一个快指针,一个慢指针,慢指针一次移动一步,快指针一次移动两步,如果有环,那么快指针一定可以重新追上慢指针。统计环中有多少个节点查找如果节点3.源码a.查找一个环中节点ListNode* MeetingNode(ListN...原创 2018-08-15 08:46:24 · 135 阅读 · 0 评论 -
剑指offer之正则表达式匹配
1.题目描述请实现一个函数用来匹配包含’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但与”aa.a”及”ab*a”均不匹配。2.分析这个正则表达式函数只涉及到’.’和’*’两个字符的匹配匹配对于’.’匹配,只...原创 2018-08-12 10:26:47 · 598 阅读 · 1 评论 -
剑指offer之删除链表结点
1.题目描述在O(1)时间删除链表结点。给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 结点。 节点结构:struct ListNode{ int m_nValue; ListNode* m_pNext;};2.问题分析因为是单链表,正常情况下,删除一个a节点,需要知道a节点的前驱节点,但是这样时间复杂度就是O(n)了...原创 2018-08-11 08:31:25 · 659 阅读 · 0 评论 -
剑指Offer之二分查找算法
1.问题描述:二分查找算法2.分析二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。二分查找的主要思路就是设定两个指针start和end分别指向数组元素的首尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明带查找元素在数组的前半段,那么将e...原创 2018-08-06 12:23:18 · 309 阅读 · 0 评论 -
剑指offer中快速排序
1.快速排序,0,1,2..n-1, 随机选出index,交换a[index]与a[n-1],将小于a[n-1]的元素放在左边,大于的元素放在右边,递归分别对两组进行排序#include &amp;lt;stdexcept&amp;gt;#include &amp;lt;ctime&amp;gt;#include &amp;lt;iostream&amp;gt;using std::cout;原创 2018-08-06 09:12:18 · 1020 阅读 · 2 评论 -
剑指offer之数值的整数次方
1.问题的描述题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。2.分析题目貌似简单,但是有不少陷阱,比如,base为0,指数(exponent)小于1(0或者负数),还要base为0,指数也是负数的情况。所以我们需要考虑到边界和处理错误情。3.源代码#in...原创 2018-08-09 23:21:16 · 280 阅读 · 0 评论 -
剑指offer之剪绳子
1.问题描述题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1]…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。2.分析方法一,动态规划,可以自顶向下,也可以从小到上方法二,贪婪算法,我们尽可能多的剪长...原创 2018-08-09 23:02:39 · 342 阅读 · 0 评论 -
剑指offer之打印1到最大的n位数
1.题目描述输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。2.分析如果简单的使用int或者long long类型来打印出结果,那么当n很大,比64还大的时候,就会出现溢出,无法打印出来应该使用字符串来模拟数字加分,才可能没有数字长度限制3.模拟加减法解法A.源码–使用vector&amp;lt;char&amp;gt; ...原创 2018-08-09 21:20:14 · 167 阅读 · 0 评论 -
青蛙跳台阶问题
1.问题描述一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。2.分析如果只有一个台阶,即n=1,那么显然就一种跳发,f(n) = 1 (n=1)如果有两个台阶,即n=2,那么有两种跳发:一种是跳两次,每次跳1级;一种是跳一次,跳2级。f(n) = 2 (n=2)如果有台阶数大于等于3,即n>=3,那又该怎么跳?。我们可以...原创 2018-08-05 16:57:52 · 3213 阅读 · 1 评论 -
两个队列实现一个栈
两个队列实现一个栈1.题目描述使用两个队列来实现一个栈2.队列与栈栈(stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,top)进行加入数据(push)和输出数据(pop)的运算。由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运...原创 2018-08-05 09:04:28 · 1657 阅读 · 1 评论 -
剑指offer之反转链表
1.问题描述定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 结构体类型:struct ListNode{ int m_nValue; ListNode* m_pNext;};2.分析注意链表为空如果链表就一个节点,那么就返回头结点如果链表有多个节点,那么需要更多考虑a-&gt;b-&gt;...-&gt;h-&...原创 2018-08-15 08:59:17 · 91 阅读 · 0 评论 -
剑指offer之合并两个排序的链表
1.题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。2.分析此题我们见得比较多。 方法一:一种是常规方法,就是先找一个头结点(链表a,链表b中头结点中值更小的节点),之后一直比较链表a,链表b中更小的节点,把小的节点,加到链表c(合并节点)中,最后把没有添加完的链表,添加到节点后面。 方法二:递归的方法(a)1 3 5 72 4 6 8...原创 2018-08-15 09:15:08 · 102 阅读 · 0 评论 -
剑指offer之之字形打印二叉树
1.问题描述题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。2.分析前面讲述了分行分成打印二叉树,这里要之字形。 例子:// 8// 4 12// 2 6 10 ...原创 2018-08-17 18:24:36 · 5083 阅读 · 0 评论 -
剑指offer之分行从上到下打印二叉树
1.问题描述题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。2.分析上一篇已经分析了不分层打印,至于如何分层打印。其实挺简单,只需要两个变量,一个保存当前层需要打印节点数,一个保存下一层需要打印节点数。3.源代码:void PrintFromTopToBottom(BinaryTreeNode* pRoot){ if(pRoot ...原创 2018-08-17 17:32:35 · 364 阅读 · 1 评论 -
剑指offer之从上往下打印二叉树
1.问题描述题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。2.分析其实这就是一个层次遍历,不是我们常见的前序,中序,后序遍历。 例如:// 10// / \// 6 14// /\ /\// 4 8 12 16这...原创 2018-08-17 16:40:17 · 151 阅读 · 0 评论