![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
牛客网剑指Offer
weixin_43160613
小菜鸟的坚持历程
展开
-
剑指Offer64:滑动窗口的最大值
思路:# -*- coding:utf-8 -*-class Solution: def maxInWindows(self, num, size): # write code here maxnum=[] if size==0 or len(num)==0: return [] for i i...原创 2019-01-23 09:29:54 · 123 阅读 · 0 评论 -
剑指Offer48:不用加减乘除做加法
思路:首先看十进制是如何做的: 5+7=12,三步走 。第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111第一步:相加各位的值,不算进位,得到010,二进...原创 2019-01-07 10:36:03 · 83 阅读 · 0 评论 -
剑指Offer58:对称的二叉树
思路:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def isSymmetrical(self, pR...原创 2019-01-17 14:42:04 · 129 阅读 · 0 评论 -
剑指Offer43:左旋转字符串
思路:# -*- coding:utf-8 -*-class Solution: def LeftRotateString(self, s, n): # write code here return s[n:]+s[:n]这个方法考虑的更加全面。 # -*- coding:utf-8 -*-class Solution: def ...原创 2019-01-02 10:18:37 · 66 阅读 · 0 评论 -
剑指Offer47:求1+2+3....n
思路:运用递归的思路,递归停止的条件是n=0,然后回溯。要注意python中逻辑运算符的用法,a and b,a为False,返回a,a为True,就返回b# -*- coding:utf-8 -*-class Solution: total=0 def Sum_Solution(self, n): # write code here ...原创 2019-01-06 10:35:45 · 62 阅读 · 0 评论 -
剑指Offer52:正则表达式匹配
思路:class Solution: # s, pattern都是字符串 def match(self, s, pattern): # 如果s与pattern都为空,则True if len(s) == 0 and len(pattern) == 0: return True # 如果s不为空,而patt...原创 2019-01-11 10:43:02 · 96 阅读 · 0 评论 -
剑指Offer39:二叉搜索树与双向链表
思路:这个人家大佬的思路,还没学习懂,不知道思路是什么呜呜呜呜,递归是个很难搞懂的东东#-*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass...原创 2018-12-26 09:59:30 · 66 阅读 · 0 评论 -
剑指Offer46:孩子们的游戏(圆圈中最后剩下的数)
思路:第一个要删除的是m-1,第二个要删除是2m-1,第三个要删除是3m-1,由于有n的限制即用求模来解决。算法中i=(m+i-1)%len(res),其中为何要减一,是因为已经从res删除了一个数,res后面的数下标会在原来的基础上减少1,所以2m-1的下标变成了2m-2,从而整个算法就可以理解了。# -*- coding:utf-8 -*-class Solution: ...原创 2019-01-05 11:49:06 · 167 阅读 · 0 评论 -
剑指Offer45:扑克牌顺子
思路:1、如果输入为空,返回false2、除了王的任何某个特定数值的牌出现两张或者更多,返回false3、先统计王的数量,再把牌排序,如果后面一个数比前面一个数大于1以上,那么中间的差值就必须用王来补了。看王的数量够不够补,如果够就返回true,否则返回false。# -*- coding:utf-8 -*-class Solution: def IsContinuo...原创 2019-01-04 20:30:59 · 122 阅读 · 0 评论 -
剑指Offer38:平衡二叉树
思路:判断是否是平衡二叉树,即判断任何一个节点的左子树和右子树的高度差的绝对值小于等于1。最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。# class TreeNode:# def __init__(self, x):# self.val = x# self.l...原创 2018-12-25 09:47:43 · 72 阅读 · 0 评论 -
剑指Offer32:第一个只出现一次的字符
思路:利用哈希表,哈希表的下标是字符的ASCII值,值为字符出现的次数。# -*- coding:utf-8 -*-class Solution: def FirstNotRepeatingChar(self, s): # write code here#建立哈希表,字符长度为8的数据类型,共有256种可能,于是创建一个长度为256的列表 ls...原创 2018-12-19 10:24:11 · 104 阅读 · 0 评论 -
剑指Offer37:二叉树的深度
思路:运用递归的方法求出二叉树的高度。递归求解:假如是空节点,则返回0;否则,原树的深度由左右子树中深度较的深度加1,为原树的深度。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2018-12-24 09:50:33 · 76 阅读 · 0 评论 -
剑指Offer42:和为S的两个数字
思路:数列满足递增,设两个头尾两个指针low和high,若array[low]+array[high]==tsum,就是答案(low和high相差越远乘积越小)若array[low]+array[high]>tsum,high-=1若array[low]+array[high]>tsum,low+= 1# -*- coding:utf-8 -*-class So...原创 2018-12-29 10:16:58 · 63 阅读 · 0 评论 -
剑指Offer31:丑数
思路:通俗易懂的解释:首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6,10,6,9,15,10,15,25九个丑数,我们发现这种方法会得到重复的丑数,而且我...原创 2018-12-18 10:20:45 · 78 阅读 · 0 评论 -
剑指Offer25:数组中出现次数超过一半的数字
思路:首先对numbers排序,然后找出数组中间的元素mid,最后判断mid出现的个数。(由于运用的快排时间复杂度最优为nlogn)# -*- coding:utf-8 -*-class Solution: def MoreThanHalfNum_Solution(self, numbers): # write code here count=0...原创 2018-12-12 10:45:25 · 68 阅读 · 0 评论 -
剑指Offer53:表示数值的字符串
思路: # -*- coding:utf-8 -*-class Solution: # s字符串 def isNumeric(self, s): # write code here hasE=False sign=False decimal=False for i in range(0,len(...原创 2019-01-12 10:55:44 · 94 阅读 · 0 评论 -
剑指Offer44:翻转单词顺序列
思路:先按空格将字符串转换成数组,然后从数组末尾元素加一个个加进去。# -*- coding:utf-8 -*-class Solution: def ReverseSentence(self, s): # write code here arr=s.split(" ") return " ".join(arr[::-1]) ...原创 2019-01-03 09:49:30 · 73 阅读 · 0 评论 -
剑指Offer63:数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:直接用sort排序,然后判断data的数据长度。# -*- coding:utf-8 -*-cl...原创 2019-01-22 16:25:54 · 223 阅读 · 1 评论 -
剑指Offer57:二叉树的下一个结点
思路:分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果# -*- coding:utf-8 -*-# class TreeL...原创 2019-01-16 10:28:20 · 76 阅读 · 0 评论 -
剑指Offer51:构建乘积数组
思路:B[i]的值可以看作下图的矩阵中每行的乘积。下三角用连乘可以很容求得,上三角,从下向上也是连乘。因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的前一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。# -*- coding:utf-8 -*-class Solution: def multiply(self, A): ...原创 2019-01-10 10:10:57 · 115 阅读 · 0 评论 -
剑指Offer62:二叉搜索树的第k个结点
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2019-01-21 09:35:05 · 105 阅读 · 0 评论 -
JS能力测评56:删除链表中重复的结点
思路:class Solution: def deleteDuplication(self, pHead): # write code here if pHead is None or pHead.next is None: return pHead head1 = pHead.next if h...原创 2019-01-15 10:39:55 · 172 阅读 · 0 评论 -
剑指Offer66:机器人的运动范围
思路:1.从(0,0)开始走,每成功走一步标记当前位置为true,然后从当前位置往四个方向探索,返回1 + 4 个方向的探索值之和。2.探索时,判断当前节点是否可达的标准为:1)当前节点满足limit限制。2)当前节点在矩阵内;3)当前节点未被访问过;# -*- coding:utf-8 -*-class Solution: def __init...原创 2019-01-25 09:34:14 · 142 阅读 · 0 评论 -
剑指Offer61:序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树思路:1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树# -*- coding:utf-8 -*-# class TreeNod...原创 2019-01-20 10:24:07 · 96 阅读 · 0 评论 -
剑指Offer50:数组中重复的数字
思路:判断元素是不是在数组a中,若不在则放入a,若在则为重复元素。# -*- coding:utf-8 -*-class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # wr...原创 2019-01-09 13:25:37 · 83 阅读 · 0 评论 -
剑指Offer60:把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:数组初始化注意,有的需要在循环里面。刚开始需要判断pRoot是否为空。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2019-01-19 12:57:01 · 153 阅读 · 0 评论 -
剑指Offer55:链表中环的入口结点
思路:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def EntryNodeOfLoop(self, pHead): # write code...原创 2019-01-14 09:34:13 · 89 阅读 · 0 评论 -
剑指Offer49:把字符串转换成整数
思路:先判断字符串的第一个字符,看是否是正负号,若是则继续,若不是则返回0再者判断之后的字符是否都是数字,若是则继续计算反之返回0最后在考虑正负号。# -*- coding:utf-8 -*-class Solution: def StrToInt(self, s): # write code here if len(s)==0: ...原创 2019-01-08 14:59:02 · 246 阅读 · 0 评论 -
剑指Offer65:
思路:# -*- coding:utf-8 -*-class Solution: def hasPath(self, matrix, rows, cols, path): # write code here for i in range(rows): for j in range(cols): ...原创 2019-01-24 09:28:21 · 161 阅读 · 0 评论 -
剑指Offer54:字符流中第一个不重复的字符
思路: char 是一个个的字符。s是所有char合起来的字符串。Insert函数统计每个字符出现的个数。FirstAppearingOnce函数找出第一个不重复字符。# -*- coding:utf-8 -*-class Solution: # 返回对应char def __init__(self): self.s = '' self....原创 2019-01-13 11:04:18 · 73 阅读 · 0 评论 -
剑指Offer59:按之字形顺序打印二叉树
思路:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def Print(self, pRoot): ...原创 2019-01-18 10:25:19 · 92 阅读 · 0 评论 -
剑指Offer36:数组中只出现一次的数字
思路:可以用位运算实现,如果将所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或 的结果,所以根据异或的结果1所在的最低位,把数字分成两半,每一半里只有只出现一次的一个数据和成对出现的数据,然后将只出现一次的一个数据分别找出。# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def ...原创 2018-12-23 11:43:29 · 84 阅读 · 0 评论 -
剑指Offer35:数字在排序数组中出现的次数
思路:因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5,返回值应该是这两个数插入的位置,然后相减就可得k出现的次数即可。(思路很巧妙,运用二分法实现)# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code...原创 2018-12-23 11:05:45 · 68 阅读 · 0 评论 -
剑指Offer30:字符串的排列
思路:代码是借鉴其他大佬的,就当做学习,递归总是有点不太行。class Solution: def Permutation(self, ss): if len(ss) <=0: return [] res = list() self.perm(ss,res,'') uniq = list...原创 2018-12-17 19:22:39 · 70 阅读 · 0 评论 -
剑指Offer14:链表中倒数第k个结点
思路: 先判断k是否小于1,若是则什么都不返回。反之,将head.val的值依次加入到列表l中,然后在判断k是否大于l的长度,若是则什么都不返回,反之返回l[-k]。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.ne...原创 2018-12-01 10:52:02 · 80 阅读 · 0 评论 -
剑指Offer11:二进制中1的个数
思路:将n每一位与1相与,若为0则0,若为1则1,并存下来,最后求和。# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here return sum([(n>>i & 1) for i in range(0,32)]) ...原创 2018-11-28 09:34:54 · 90 阅读 · 0 评论 -
剑指Offer10:矩形覆盖
思路:第一步有两种放法:横着放需要1块,剩下f(n-1)放法;竖着放需要2块,剩下f(n-2)即f(n)=f(n-1)+f(n-2)# -*- coding:utf-8 -*-class Solution: def rectCover(self, number): # write code here if number==0: ...原创 2018-11-27 13:27:44 · 88 阅读 · 0 评论 -
剑指Offer9:变态跳台阶
思路:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)因为f(n-1)=f(n-2)+f(n-3)+...+f(1)+f(0)所以f(n)=2*f(n-1) 其中f(1)=1,n>=2# -*- codi...原创 2018-11-27 13:04:21 · 87 阅读 · 0 评论 -
剑指Offer8:跳台阶
思路:分析可知:青蛙跳n台阶一共有多少种跳法满足斐波那契数列。# -*- coding:utf-8 -*-class Solution: def jumpFloor(self, number): # write code here s=[] s.append(1) s.append(2) for i...原创 2018-11-27 10:21:09 · 82 阅读 · 0 评论 -
剑指Offer13:调整数组顺序使奇数位于偶数前面
思路:依次判断每个元素,若是奇数则放到odd列表中,若是偶数则放到even列表中。然后将两个列表合并再返回。# -*- coding:utf-8 -*-]class Solution: def reOrderArray(self, array): # write code here odd=[] even=[] ...原创 2018-11-30 10:08:23 · 105 阅读 · 0 评论