![](https://img-blog.csdnimg.cn/20190706162312879.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer
文章平均质量分 50
剑指offer牛客网66题全解+思路+测试用例
manba_
这个作者很懒,什么都没留下…
展开
-
剑指offer序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路 序列化先序遍历 遇到没有结点的,存入'$' 反序列化数组从头遍历 在还没遇到'$',就一直构建树 遇到了就返回根节点# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val...原创 2019-07-06 16:19:01 · 134 阅读 · 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出现的次数)。思路 https://www.cnblogs.com/wa...原创 2019-07-06 10:46:00 · 115 阅读 · 0 评论 -
剑指offer不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路1(超时)两个数进行异或,可以做不进位的加法 通过与运算和左移可以实现进位 进位的数和异或的结果接着进行异或 直到不再产生进位,返回结果# -*- coding:utf-8 -*-class Solution: def Add(self, num1, num2): ...原创 2019-07-06 08:38:45 · 123 阅读 · 0 评论 -
剑指offer求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路先用一个变量去保存当前值 利用n>0和递归,从n遍历到0 从0开始往回返,每次加上进来保存的当前值# -*- coding:utf-8 -*-class Solution: def Sum_Solution(s...原创 2019-07-05 17:40:54 · 135 阅读 · 0 评论 -
剑指offer孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-07-05 16:47:38 · 105 阅读 · 0 评论 -
剑指offer扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2019-07-05 16:16:06 · 132 阅读 · 0 评论 -
剑指offer数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路base为0时,返回0。避免除数为0的错误 exponent大于0,正常做 exponent小于0,求其倒数# -*- coding:utf-8 -*-class Solution: def Power(self, base, exponent):...原创 2019-07-05 11:00:17 · 82 阅读 · 0 评论 -
剑指offer二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1整数和1进行与运算,为True,count值就+1 否则整数就右移一位 直到<0 由于python的存储机制,当整数为负数时,需先将整数控制在32位字节(n=n&0xffffffff)# -*- coding:utf-8 -*-class Solution: def Numb...原创 2019-07-05 10:25:16 · 69 阅读 · 0 评论 -
剑指offer二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 提到二叉搜索树就会想到中序遍历,因为会返回一个有序的数组。树有左右孩子,相当于双向链表一前一后的指针首先需定义一个变量用来保存前一个结点 之后中序遍历左结点,left指向变量保存的前一个结点 如果有前一个结点,就让前结点的right指向当前遍历...原创 2019-07-05 09:10:32 · 104 阅读 · 0 评论 -
剑指offer二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路中序遍历结点,用列表存储 返回列表第k-1位置上的结点 还需注意k<=0或者k>列表长度,返回None# -*- coding:utf-8 -*-# class TreeNode:# def __init__(...原创 2019-07-04 23:58:56 · 96 阅读 · 0 评论 -
剑指offer按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路 大体可以按照把二叉树打印成多行那道题去做在循环前先定义一个变量i(i=0),用于记录当前层是奇数还是偶数 奇数从左到右,偶数从右到左打印# -*- coding:utf-8 -*-# class TreeNod...原创 2019-07-04 23:25:33 · 92 阅读 · 0 评论 -
剑指offer把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路类似BFS,只不过需创建几个列表,来保存当前层和下一层的结果...原创 2019-07-04 22:44:57 · 141 阅读 · 0 评论 -
剑指offer对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路 一起遍历一样的两个二叉树如果两棵树都没有节点了,返回True 如果一个有,一个没有,返回False 如果树1左的值和树2右的值不相等,或者树1右的值和树2左的值不相等,返回False# -*- coding:utf-8 -*-# class ...原创 2019-07-04 19:32:46 · 161 阅读 · 0 评论 -
剑指offer二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路 中序遍历:左根右如果该节点有右子树,就一直遍历它的右子树中的左结点 没有右子树,如果该结点是其父节点的左孩子,返回父节点。 如果不是,则返回其父节点继续向上查找# -*- coding:utf-8 -*-# class...原创 2019-07-04 18:48:08 · 103 阅读 · 0 评论 -
剑指offer平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路 左右子树的长度差不大于1为平衡二叉树,可以借助二叉树深度一题。二叉树深度一题是从下往上算长度,而这道题是利用二叉树深度一题,从上到下判别各个子树是否为平衡二叉树统计左子树的深度 再统计右子树的深度 如果之差大于1,返回False 否则,递归继续判别左子树的左右子树,和右子树的左右子树 遇到没有结点时,返回T...原创 2019-07-04 17:44:06 · 130 阅读 · 0 评论 -
剑指offer二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路递归地从上向下走 遍历到底部(叶子结点)时,当前层的长度为1 再逐渐往回返,每个当前层的长度为左右子树长度的较大值+1 如果当前没节点,返回0# -*- coding:utf-8 -*-# class TreeNode:# def _...原创 2019-07-04 16:57:39 · 89 阅读 · 0 评论 -
剑指offer二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路 深度优先搜索(DFS)如果有左孩子,就将左孩子存起来,路径之和累加 有右孩子也一样处理 如果没有左右子孩子并且路径之和等于给的目标值,就把该路径存起来#...原创 2019-07-03 23:47:53 · 98 阅读 · 0 评论 -
剑指offer二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 后序遍历最后一个结点为根节点,在二叉搜索树中,根节点的值小于右子树的值我们可以在数组中找到第一个大于根节点值的结点 之后从这开始遍历,到根节点之前 如果有小于根节点值的,返回Flase 否则,依次递归查找,直到数组为空...原创 2019-07-03 22:38:44 · 113 阅读 · 0 评论 -
剑指offer从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路 这道题就是树的层次遍历,也是广度优先搜索(BFS)将根节点放入队列 之后在pop队列的第一个结点时 如果它有左孩子就放进队列,有右孩子也放进队列 直到队列为空# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):...原创 2019-07-03 19:21:37 · 94 阅读 · 0 评论 -
剑指offer二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。思路如果有根结点,就互换它的左右孩子 分别递归左、右孩子 直到没有根节点# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2019-07-03 19:14:19 · 67 阅读 · 0 评论 -
剑指offer树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路 这道题我们要用递归去做,为了满足空树不是任意一个树的子结构,我们还需再定义另外一个函数来实现递归判断(如果一旦把这个条件放到递归,一遍历完树2,就返回False,这明显是错的)如果树2被遍历完了,返回True 如果树1被遍历完了,让树1和树2的当前结点比较是否相同 树...原创 2019-07-03 16:36:49 · 486 阅读 · 0 评论 -
剑指offer重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路递归地按照前序的顺序,制作成根节点 在中序中找到根节点的索引,按照其索引将树分为左子树和右子树 直到前序和中序序列没有 返回根节点...原创 2019-07-05 00:05:16 · 71 阅读 · 0 评论 -
剑指offer复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路正常复制,将复制的每个结点放在对应的每个结点后面(方便下一步复制任意结点) 遍历链表,如果有原结点有任意结点,就将任意结点的下一个赋值给原结点下一个结点的任意结...原创 2019-07-03 08:11:16 · 82 阅读 · 0 评论 -
剑指offer删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路定义两个结点,一前一后 如果后一个结点和它的下一个结点不相等,前一个结点和后一个结点分别向后移 如果相同,就先记录这个结点值,后一个结点继续向后遍历,直...原创 2019-07-02 22:31:58 · 121 阅读 · 0 评论 -
剑指offer链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路定义两个指针,慢指针一次走一步,快指针一次走两步 当指针指向的结点相同时,已找到环中的一个结点 从这个结点出发,边走边计数,当再次回到该节点时,计的数即为环的长度 一个结点从头走,另一个结点先走计数的步数,当两指针相遇即为环的入口结点# -*- coding:utf-8 -*-# clas...原创 2019-07-02 22:30:14 · 102 阅读 · 0 评论 -
剑指offer两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路 难点在于:两个链表可能不一样长,但是一旦有了第一个公共结点,后面所指向的结点就都是一样的了先算出两个链表的各自长度 链表长的,先走(长-短)步 之后按正常查找即可# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# ...原创 2019-07-02 22:28:34 · 123 阅读 · 0 评论 -
剑指offer合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路新建一个结点用来保存合并后的链表 当链表1和链表2都有结点时 如果链表1结点值较小,就将链表1的结点放在新建结点的后面,链表1和新建结点分别后移。反之,链表2一样 当链表1有剩余,就将剩余的结点接在后面。反之,链表2一样# -*- coding:utf-8 -*-# cl...原创 2019-07-02 22:27:04 · 113 阅读 · 0 评论 -
剑指offer反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路创建一个结点prehead用来保存当前结点的前结点 先将当前结点的下一个结点保存起来,以免断链时找不到后续的结点 当前结点与下一个结点断开,回指前一个结点 前一个结点后移 当前结点后移# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x)...原创 2019-07-02 22:24:49 · 75 阅读 · 0 评论 -
剑指offer链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路设置两个指针都先指向头节点 让一个先走k步,(当链表长度不足k个,会出错,需在这步中设置变量,检查是否可以走k步) 之后两个指针再同时出发 当先走的指针遍历完链表后 后走的指针指的节点就是倒数第k个节点# -*- coding:utf-8 -*-# class ListNode:# def __init__(...原创 2019-07-02 22:23:26 · 89 阅读 · 0 评论 -
剑指offer从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路遍历链表,把元素放进栈中 之后打印栈中元素# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solut...原创 2019-07-02 22:20:32 · 124 阅读 · 0 评论 -
剑指offer栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路pushV中的元素从头到尾的依次进入辅助栈 辅助栈模仿pushV的出栈顺...原创 2019-07-01 13:49:51 · 91 阅读 · 0 评论 -
剑指offer包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路如果只靠一个栈去做。每次把最小值放在栈顶,一旦pop,没办法找到刚进去的元素 需要一个辅助栈,去保留每次push栈中的最小值元素,另一个栈保存正常push元素的顺序# -*- coding:utf-8 -*-class Solution: def __ini...原创 2019-07-01 11:41:47 · 100 阅读 · 0 评论 -
剑指offer矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路和跳台阶那道题是一样的# -*- coding:utf-8 -*-class Solution: def rectCover(self, number): # write code here if n...原创 2019-07-01 09:53:00 · 115 阅读 · 0 评论 -
剑指offer变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路f(1)=1,f(2)=2,f(3)=4... 分别为2^0,2^1,2^2...# -*- coding:utf-8 -*-class Solution: def jumpFloorII(self, number): # write...原创 2019-07-01 09:35:11 · 116 阅读 · 0 评论 -
剑指offer跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路类似斐波那契数列 只不过从first=1,last=2开始 执行n-1次# -*- coding:utf-8 -*-class Solution: def jumpFloor(self, number): # write c...原创 2019-07-01 09:14:57 · 126 阅读 · 0 评论 -
剑指offer斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39。n=0,f(n)=0;n=1,f(n)=1;n>1,f(n)=f(n-1)+f(n-2)思路 从底层往上层逐步累加first去保存上一个值 last保存这次累加好的和 之后再去累加 执行n次# -*- coding:utf-8 ...原创 2019-07-01 08:36:54 · 109 阅读 · 0 评论 -
剑指offer用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路push操作:进栈和进队列是一样的 pop操作:如果栈2有,就pop出来 没有就把栈1里的元素全部pop进栈2,之后再从栈2里pop# -*- coding:utf-8 -*-class Solution: def __init__(self): self....原创 2019-06-30 22:18:23 · 119 阅读 · 0 评论 -
剑指offer字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。思路创建一个字典用来保存字符和字符出现的次数 还需要创建一个空字符,用来保存字符流不断输入进去的字符 如果字符之前...原创 2019-06-30 15:35:15 · 83 阅读 · 0 评论 -
剑指offer表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路需要三个变量,来看之前是否已经有了e|E,点,符号 e|E之前不能再有e|E,e|E不能在最后 点之前不能再有点,同时点之前...原创 2019-06-30 14:44:20 · 148 阅读 · 0 评论 -
剑指offer正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路 这道题难点在于,模式串下一位为"*"的处理当检测到下一位为"*",...原创 2019-06-30 09:44:39 · 92 阅读 · 0 评论