剑指offer
汝之宿命
这个作者很懒,什么都没留下…
展开
-
迭代的方式来遍历树(前序中序后序)百度一面
递归的方式来进行遍历树很简单。但是通过迭代的方式遍历树。首先中序遍历中序遍历就主要在于先走到最左节点,然后从这个节点进行左中右的顺序。因为到了最左的节点也要往回走,而为了支持这个回溯类似的方式,用栈来保存数据,进入一个下一个节点的就通过换一个节点继续从开头(所有左部分节点压入)code:void PreOrderWithoutRecursion1(BTNode* root){ if (root == NULL) return; node* p = root; stack<nod原创 2020-08-19 17:51:53 · 219 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值(单调队列)
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -思路:首先,要保存所有压入的数字,因为pop时返回值,其次,维护最大值当前:但是基于队列的性质,保证先进先出,所以当后面进入的数字,能够影响到此时的最大值的只有前面的比他大的数,所以这就是天然的单调队列的时候,在每次压入的时候,都将小于该数的弹出,然后就维护了一个递减队原创 2020-08-07 11:53:26 · 113 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数(dp)
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。思路:如果暴力找出所有的解,时间复杂度是6^n;时间复杂度太高了,所以想要加速,然后想到了换硬币的题目, n个骰子,最大和为n6,f(i,j )为骰子是i个时,和为j 的出现次数。则会有:f (i , j) += f(i-1, j-(1到6))这样,就是i个骰子时,是依赖于i-1个骰子的,然后 j原创 2020-08-06 21:55:28 · 126 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字(模拟,约瑟夫环)
思路1:用list来进行模拟,然后进行删除,这种方式注意的是记得删除和迭代器++的时候注意转换为begin。然后可以再过程中判断size和m的取余来加速错误,因为数从一开始到结束都是固定的,不能一直是0-8,0-7减少一个不是减少最大值思路2:通过找出递归公式:m=3n == 1, f=0 n = = 2, f=1n==3 ,f=1f(n, m)=f ((n-1, m)+m)%n就是少一位的被删除的index+m的结果然后再取余(防止溢出)就得到下一个的了。代码: int last原创 2020-08-06 17:44:21 · 89 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法(异或+与)
异或:没有进位的加法与:进位的一种方式注意:如果是无符号数,在左移的时候最左边的位不变!(所以为了比卖你,就要强转为unsigned int)再移位;code:class Solution {public: int add(int a, int b) {//思路:异或是没有进位的加法;与 是可以直到进位在哪的方法 int another,res; do{ res=a^b; //没有进位的加法原创 2020-08-04 00:33:39 · 126 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数(不能开大的整数比如int参数,不能long)
注意的点:排除空格,还有± 号,并且记录flag==1还是-1大数判断!**重点在于判断的负数的时候,要转换成负数的,因为整数最大值和最小值的绝对值不一样,最小值绝对值大一个。**方法:在判断的时候用==INT_MIN来判断也可以是通过按照不同flag进行计算的方式避免到达整数的最大值+1(负数最大值)不能开大的存储类型时,用 res > (INT_MAX-tmp)/10 来检验。因为res到不了,但是最大值可以变,最小值同理 -res< (INT_MIN+tmp)/10co原创 2020-08-03 23:45:13 · 108 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:首先用动态规划,一个位置的字符,如果可以和前面的组成数字在10-25之间,那么就可以更新当前位置res为f1+f2 的和。然后往后走。如果不能组合 res=f2 .【用了两个函数主要】string类的 substr(string开始的位置下标,取得长度),和 stoi原创 2020-07-17 15:21:03 · 138 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路:m) 数字按照0123。。101112.。开始排序,第n位是什么:int最大是有10位数,去除0第一位,然后每一个不同区间开始都是1pow(10, digit-1) ,区间的位置最后都是9 pow(10, digit-1)*digit个,每次n都会减去前一段的,如果n< 当前区间的个数,就返回原创 2020-07-17 12:16:25 · 91 阅读 · 0 评论 -
【剑指】77,剪绳子(规律:基于2,3)
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思路:首先明确有两个数和不变,两个数越相近乘积越大的原理。但是这个题不是这样做的。我...原创 2020-03-23 00:44:26 · 418 阅读 · 0 评论 -
【剑指】76,机器人运动路径(上下左右)
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:nc,xd首先,类似上一题,用一个...原创 2020-03-22 00:51:57 · 632 阅读 · 0 评论 -
【剑指】75,矩阵中的路径(找入口,递归上下左右)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。思路:一个接口,遍历矩阵中每一个元素找到首字母,然后传入子接口,按照这个点开始走,判断结果。如果false,继续遍历。子接口是得知第一个首节点后传入的从这...原创 2020-03-21 22:48:00 · 206 阅读 · 0 评论 -
【剑指】74,滑动窗口
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5...原创 2020-03-21 01:28:37 · 81 阅读 · 0 评论 -
【剑指】73,数据流的中位数(大根堆和小根堆)
**题目描述**如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:利用两个堆,一个大根堆一个小根堆。然后插入的时候通过两者的size和顶部的数字进行判断。...原创 2020-03-21 00:53:07 · 220 阅读 · 0 评论 -
【剑指】72,二叉搜索树的第k个节点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4思路:就是一个二叉搜索树遍历的过程,然后从最左节点开始,左中右(中序遍历)定义一个类全局变量count来进行–;ans作为值-结果类型参数传入代码:/*struct TreeNode { int val; struct TreeNo...原创 2020-03-21 00:36:43 · 95 阅读 · 0 评论 -
【剑指】71.序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到...原创 2020-03-21 00:04:48 · 74 阅读 · 0 评论 -
【剑指】70,二叉树打印成多行(辅助队列,null间隔)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:用一个辅助队列,从左到右将节点输入,用一个null来作为隔断。每层输出。输出的是值,不是节点指针,判断非空代码:class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { queue<Tree...原创 2020-03-19 23:19:23 · 80 阅读 · 0 评论 -
【剑指】69,按之打印二叉树(
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:要按照之打印。首先给的是根节点(代表从左到右了),接下来要从右到左。我们可以用两个栈来存放不同顺序的节点。stackL存放从左到右的,stackR存放从右到左的。当一边为空后要push入res中。在压入在压入每一行的时候,要注意判断...原创 2020-03-19 21:57:17 · 108 阅读 · 0 评论 -
【剑指】68,对称二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:首先,从根节点判断,为空就返回,然后进入两个节点你比较的接口;先判断,如果两个节点都为空,返回真;然后在此基础上,判断当其中一个为空时:返回假;(因为之前就排除了都为空)此时就剩下两个都不为空了。如果 **此时两个节点的值相等的话!**利用递归判断1节点的左节点&a...原创 2020-03-17 01:49:16 · 57 阅读 · 0 评论 -
【剑指】67,二叉树下一节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:首先,给定一个树中的节点。如果这个节点有右子树,那返回右子树。如果该节点没有右子树:那么我们就需要找到父节点(迭代过)是祖父节点的左子树的节点,返回祖父节点(迭代过)否则返回空!代码:/*struct TreeLinkNode { ...原创 2020-03-15 22:16:29 · 69 阅读 · 0 评论 -
【剑指】66,删除链表中重复的(首尾两个节点递归)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:递归,分成两个节点来判断。首节点和次节点,如果相等,此节点遍历到不相等的地方, 然后返回 再调用该函数的结果,如果不相等,将次节点作为新调用函数的首节点传入,返...原创 2020-03-15 20:53:12 · 94 阅读 · 1 评论 -
【剑指】65,找到链表环的入口节点(进环,得数,一起走)
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:1,快慢指针先将一个指针打入环内,2,计算环内有多少个节点3,从开开始让一个指针先走环内的节点数的节点,然后两个指针再一起走,最终相遇点就是环的入口点代码:首先确定有环:class Solution {public: ListNode* EntryNodeOfLoop(ListNode...原创 2020-03-14 23:13:27 · 75 阅读 · 0 评论 -
【剑指】64,字符流中第一个不重复的字符(hash+queue)
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。思路:像这种看状态的用hash最合适。并且用queue来依序存储出现的不重复的字符,insert如果出现...原创 2020-03-14 21:51:32 · 118 阅读 · 0 评论 -
【剑指】63,表示数字的字符串(写出测试用例)
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路:其中有一个E数要注意,aEb=a*10^b.注意不能aE,大树可Ea=1Ea按照数字组成:先正负。然后再数字/e,如果是数字,就乘以...原创 2020-03-14 21:42:49 · 293 阅读 · 0 评论 -
【剑指】62,正则表达式(有*无*)
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:首先,我们判断是不是到了模式串的尾部,如果是,并且此时str原生串到了尾部,那么返回真,否则...原创 2020-03-14 01:48:17 · 203 阅读 · 0 评论 -
【剑指】61,构造乘积数组(二维坐标没有对角线)
题目描述给定一个数组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[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)思路:按照二维坐标的方式计算上三角和下三角。代码:clas...原创 2020-03-13 21:20:25 · 87 阅读 · 0 评论 -
【剑指】60,数组中重复的数字(0-n-1范围n数字)
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:注意条件是在0-n-1之间的数字范围(n个数字)。因为是找出任意一个重复的。所以难度就低了,只要从0开始遍历,将该...原创 2020-03-13 20:06:13 · 296 阅读 · 0 评论 -
【剑指】59,字符串转整数(细节:空格,+-,大数)
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0思路:告知输入的格式:第一个是有空格吗?要过滤吗?首先判断数字的正负。+/-每个数逐个开始。判断有没有超最大数代码:class Solution {public: int StrToInt(string str) { if(str.size()==0) ...原创 2020-03-13 19:36:20 · 82 阅读 · 0 评论 -
【剑指】58,不用加减乘除做加法(异或+进位处理)
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:首先,异或就是不带进位的加法!其次,计算进位:通过与结果左移一位,不能是负数,class Solution {public: int sum(int x1,int x2) { if(x1<0 &&x2>0) int tmp; while(x1!=0) /...原创 2020-03-13 19:21:00 · 192 阅读 · 0 评论 -
【剑指】57,等差数列(逻辑与短路原则)
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:上述不能用 ,我们使用递归运算的加法,然后用与的短路原则来终止代码。class solu{ public: int sum(int n) { int s=n; s&& (s+=sum(n-1)); retu...原创 2020-03-13 19:05:59 · 102 阅读 · 0 评论 -
【剑指】56,圆圈最后剩的数字(链表)
题目描述抽象后,n个数字,一开始给一个m(m<n),从0开始到m-1.第m-1个需要被移除。然后,从m-1的下一个开始又0~m-1,第m-1的那个继续被移除,问:最后剩下来的数字是?(没有返回-1)思路:因为需要频繁地修改节点,所以我们采用list链表来作为数据结构。首先存入节点,然后找到第m个节点,同时记录下一个开始的节点,这两步都要注意不能越界要做end判断。然后擦除节点,继续m-...原创 2020-03-12 00:40:08 · 85 阅读 · 0 评论 -
【剑指】55,扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张...原创 2020-03-11 23:23:16 · 80 阅读 · 0 评论 -
【剑指】54,反转单词序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:1,思路1.时间...原创 2020-03-11 00:27:51 · 76 阅读 · 0 评论 -
【剑指】53,左旋转字符串(转置的转置)
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:我们这里用到矩阵的思想:xy=(y转置*x转置)的转置。更改两者顺序。所以我们先判断移位...原创 2020-03-10 22:24:38 · 368 阅读 · 0 评论 -
【剑指】52,和为s的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:因为要求输出的两个数的乘积最小,对于已经排好序了的数组,两个数挨得越近乘积越大,离得越远乘积越小(通过这个性质)我们可以从首尾两头开始遍历,大于targetsum就right–,小于就left...原创 2020-03-10 22:04:21 · 77 阅读 · 0 评论 -
【剑指】51,和为s的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述: 输出所有和为S的连续正数序列。...原创 2020-03-10 21:43:10 · 91 阅读 · 0 评论 -
【剑指】50,数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:这个题目是之前的数组中只出现一次的的一个数字的变形。重点在于我们要将这两个数字分开在两个不同的堆。所以,思路形成了:这两个数字一定不一样。所以我们将所有的数字先一起异或。的出来的结果就是实际的那两个数字的异或结果。然后我们通过提取里面的数字的某一个为1的位来实现将数组分为两堆。然后我们通...原创 2020-03-08 23:40:01 · 66 阅读 · 0 评论 -
【剑指】49,平衡二叉树判断
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路;首先确认平衡二叉树定义,首先是二叉树,其次是每个节点的左右子树的高度差的绝对值要小于等于一,并且该节点的左右子树也得是平衡二叉树。代码:class Solution {public://还得是二叉搜索树和平衡的 bool IsBalanced_Solution(TreeNode* pRoot) { if...原创 2020-03-08 23:27:54 · 53 阅读 · 0 评论 -
【剑指】48,二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:遍历树,然后到叶子节点后深度和max相比较。记录。代码:方法一:直接递归```cpp int TreeDepth(TreeNode* pRoot) { if(pRoot==nullptr) retu...原创 2020-03-08 22:01:35 · 71 阅读 · 0 评论 -
【剑指】47,数字在排序数组出现的次数
题目描述统计一个数字在排序数组中出现的次数。思路:二分法,先找到那个数字,然后往两边扩。代码class Solution{public: int GetNumberOfK(vector<int> data, int k) { if(data.size()==0) return 0; int len=data.size(); int locate=0,coun...原创 2020-03-08 21:32:24 · 71 阅读 · 0 评论 -
【剑指】46,两个链表第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路:我们先得出两个链表的长度,然后将长的那一个先走两个的差值,然后我们让两个同时开始走,走一步判断一下。直到两个为空,或者找到相同的节点!代码/*struct ListNode { int val; struct ListNode *next;...原创 2020-03-08 21:04:28 · 66 阅读 · 0 评论