剑指offer
剑指offer题目分析及代码实现,个人笔记
Amon O_*
这个作者很懒,什么都没留下…
展开
-
剑指offer——67剪绳子(Python)
【题目】给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。【思路】第一种方法是暴力递归法,不断的去判断前一次所有的剪法中乘积最大的剪法,Python的递归深度有限制。不建议采取此方法,太多的重复计算。【代码】class Solution: def fu原创 2020-06-29 21:08:45 · 116 阅读 · 0 评论 -
剑指offer——64滑动窗口的最大值(Python)
【题目】给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6原创 2020-06-29 18:39:28 · 2281 阅读 · 0 评论 -
剑指offer——63数据流中的中位数(Python)
【题目】如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数【思路】本题考察的应该是小顶堆和大顶堆,但是下面的python代码调用了一个排序函数,算取巧了,以后会用java实现堆的解决方法。【代码】class Solution: def __init__(self):原创 2020-06-29 15:44:36 · 2330 阅读 · 0 评论 -
剑指offer——48不用加减乘除做加法(Python)
【题目】写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。【思路】本题考察的与运算,异或运算和进位符,题解中python的调用sum()方法就没写了。下面的代码运行超时,但思路是对的。先将两个数异或运算,相当于二进制每一位相加,不考虑进位,按位与之后左移一位得到进位,再将两数相加,直到进位为0,输出两数的和。【代码】class Solution: def Add(self, num1, num2): # write code here原创 2020-06-29 14:42:25 · 120 阅读 · 0 评论 -
剑指offe——61序列化二叉树(Python)
【题目】请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的原创 2020-06-29 14:05:23 · 764 阅读 · 0 评论 -
剑指offer——二叉搜索树的第K个节点(Python)
【题目】给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。【思路】结合中序遍历和二叉搜索树的性质(二叉搜索树的左子树小于根节点,右子树大于根节点,所以中序遍历就是从小到大排好序的)得出中序序列后,输出第k个即可。【代码】class Solution: # 返回对应节点TreeNode def KthNode(self, pRoot, k): global res res原创 2020-06-28 22:13:05 · 135 阅读 · 0 评论 -
剑指offer——60把二叉树打印成多行(Python)
【题目】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。【思路】具体思路参考59题,本题不需要对偶数行进行翻转。【题目】class Solution: # 返回二维列表[[1,2],[4,5]] def Print(self, pRoot): if not pRoot: return [] nodeStack=[pRoot] result=[] while nodeStack:原创 2020-06-28 21:25:19 · 147 阅读 · 0 评论 -
剑指offer——59按之字形顺序打印二叉树(Python)
【题目】请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。【思路】本题利用两个栈进行处理(没有用到栈的特点),一个存放当前层的节点,一个存放下一层的节点,在设置一个变量判断当前层数是偶数层还是奇数层,是偶数层的话将其翻转再添加到结果中,奇数层,直接添加。处理完一层后,将下一层的节点传到当前层的中,下一层设置为空。【代码】class Solution: def Print(self, pRoot):原创 2020-06-28 20:56:25 · 92 阅读 · 0 评论 -
剑指offer——58对称二叉树(Python)
【题目】请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。【思路】若一颗二叉树是对称二叉树,其左右子树也是对称二叉树,其左子树的右子树等于其右子树的左子树(可画图辅助理解)递归进行处理,关键是边界条件的判断。【代码】class Solution: def isSymmetrical(self, pRoot): # write code here def fun(p1,p2): i原创 2020-06-28 18:39:06 · 1227 阅读 · 0 评论 -
剑指offer——57二叉树的下一个节点(Python)
【题目】给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。【思路】首先明确一点中序遍历顺序是左根右,所以先判断当前节点有没有右子树,如果有右子树,下一个节点是右子树最左边的节点。如果没有右子树,就找第一个当前节点是父节点左孩子的节点,返回其父节点。(注意,这里的next指的是父节点),循环调节就是遍历到根节点。【代码】class Solution: def GetNext(self, pNode):原创 2020-06-28 16:27:52 · 76 阅读 · 0 评论 -
剑指offer——56删除链表中的重复数字(Python)
【题目】在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5【思路】首先定义一个空的链表头,防止碰到前两个节点相同的情况,然后用两个指针进行判断。当last指针当前的值和last.next的值相同时,就用一个循环语句,找到连续相同的值,找到出现第一个不相同的值,然后将pre指针的next指向这个值,同时last指针指向这个值的后一个,如果没原创 2020-06-27 14:47:33 · 305 阅读 · 0 评论 -
剑指offer——53表示数值的字符串(Python)
【题目】请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。【思路】主要是一些符号出现的个数和位置的判断,具体看代码注释。【代码】class Solution: # s字符串 def isNumeric(self, s): # write code here #定原创 2020-06-26 21:18:22 · 176 阅读 · 0 评论 -
剑指offer——52正则表达式匹配(Python)
【题目】请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配【思路】本题采用递归的方法逐个比对字符串和模式中字符,首先分成两种情况,看第二个字符是不是’*’。)当第二个字符不是’*‘时:(1)判断字符串第一个字符和模式的第一个字符是否相等(注意:模式第一个字符为’.‘也可原创 2020-06-26 19:52:48 · 128 阅读 · 0 评论 -
剑指offer——51构建乘积数组(Python)
【题目】给定一个数组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];)【思路】可以先将A中元素先乘起来,然后依次除以A[i]即可得到B[i],但本题不允许使用除法,所以分成两部分来做,现在i前面的相乘,再乘以i后面的元素。【代码】class S原创 2020-06-26 12:37:16 · 113 阅读 · 0 评论 -
剑指offer——39平衡二叉树(Python)
【题目】输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。【思路】本题在做完38题的基础上很容易解出,判断左子树和右子树的深度差是否大于1,大于1则返回False,若小于则判断其子节点的左右子树的深度是否都是小于等于的,一个递归操作。【代码】class Solution: def IsBalanced_Solution(self, pRoot):原创 2020-06-22 15:50:53 · 115 阅读 · 0 评论 -
剑指offer——38二叉树的深度(Python)
【题目】输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。【思路】求二叉树的深度可以通过求其子树的深度加1即可,在左子树和右子树子树中选择最大的。【代码】# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right原创 2020-06-22 15:37:11 · 115 阅读 · 0 评论 -
剑指offer——50数组中重复的数字(Python)
【题目】在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。【思路】建立一个字典,value是数组中数字出现的次数,出现了两次(即字典中有这个数)则将其赋给duplication[0],返回True.【代码】class Solution: # 这里要特别注意~找到任意重复的一个值并赋原创 2020-06-18 12:01:28 · 162 阅读 · 0 评论 -
剑指offer——44 翻转单词序列(Python)
【题目】牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?【思路】【代码】...原创 2020-06-17 12:59:45 · 308 阅读 · 0 评论 -
剑指offer——43左旋转字符串(Python)
【题目】汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!【思路】本题考察的是翻转字符串,就是如何从AB->BA,可以先将A翻转,再将B翻转,最后将翻转后的AB一起翻转,即通过三次翻转得出最后的字符串。因为Python中string的值不能通过下标的改变而改变,所原创 2020-06-17 00:24:19 · 123 阅读 · 0 评论 -
剑指offer——42和为S的两个数字(Python)
【题目】输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。【思路】这题有一个思维误区,很多人想着怎么去得到两个乘积最小,这是一个递增数列,间隔最大的两个数乘积最小,相通这点后就较为简单,从两端往中间夹,相加等于tsum时输出这两个数,若两端的和大于tsum,说明太大了,右端点往左移动一位,若小于,则左端点往右移动一位。【代码】class Solution: def FindNumbersWithSum(self, a原创 2020-06-16 21:24:06 · 124 阅读 · 1 评论 -
剑指offer——41和为S的连续正数序列(Python)
【题目】小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!【思路】下面第一个代码未能通过所有测试用例,因为没对B 进行排序,我自己想的,越写越复杂就不想写了。思路不建议看,写的乱七八糟的,就是,先判断有几个正数相加可原创 2020-06-16 20:19:22 · 118 阅读 · 0 评论 -
剑指offer——44求1+2+3+...+n(Python)
【题目】求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。【思路】一个投机取巧的方法就是使用pow()函数加上移位符,实现等差数列求和公式。【代码】import mathclass Solution: def Sum_Solution(self, n): # write code here res = int((math.pow(n, 2) +n))>>1原创 2020-06-03 01:42:36 · 596 阅读 · 0 评论 -
剑指offer——37数字在排序数组中出现的次数(Python)
【题目】统计一个数字在排序数组中出现的次数。【思路】 简单的方法就是建一个字典存放数字出现的字数,最后输出k出现的次数,或者直接遍历数组,逐个和k比较,最后输出。【代码】class Solution: def GetNumberOfK(self, data, k): # write code here if data == None or k == None or k not in data: return 0 num =原创 2020-06-03 00:16:26 · 106 阅读 · 0 评论 -
剑指offer——32把数组排成最小的数(Python)
【题目】输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。【思路】这题可以转化为一个优先级的问题(个人理解),就是将第一个数A和后面的数x依次比较优先级,Ax>xA说明x应该放在A前面然后依次按照优先级排序,把最高的放在第一位,这样就转化为一个排序的问题,排完序后按照将其连成一个字符串,即可输出。【代码】class Solution: def PrintMinNu原创 2020-05-30 01:35:57 · 206 阅读 · 0 评论 -
剑指offer——30连续子数组的最大和
【题目】HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)【思路】本题主要思路是,从第一个往后加,如果加到第n个,和还没原创 2020-05-29 23:35:03 · 73 阅读 · 0 评论 -
剑指offer——29最小的k个数(Python)
【题目】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【思路】主要考查的是排序算法,先将数组升序排序,取出前k个即可,注意边界条件。【代码】class Solution: def GetLeastNumbers_Solution(self, tinput, k): # write code here if tinput == None or k == None or k > len原创 2020-05-29 22:51:43 · 141 阅读 · 0 评论 -
剑指offer——19顺时针打印矩阵(Python)
【题目】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.【思路】【代码实现】...原创 2020-05-29 16:21:26 · 103 阅读 · 0 评论 -
剑指offer——26二叉搜索树与双向链表(Python)
【题目】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。【思路】【代码】原创 2020-05-26 11:01:59 · 128 阅读 · 0 评论 -
剑指offer——24二叉树中和为某一值的路径(Python)
【题目】输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。【思路】【代码】class Solution: # 返回二维列表,内部每个列表表示找到的路径 def FindPath(self, root, expectNumber): # write code here if not root: return [] if原创 2020-05-26 13:34:44 · 184 阅读 · 0 评论 -
剑指offer——19顺时针打印矩阵(Python)
【题目】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.【思路】首先对矩阵的第一行取出添加到结果数组里,然后对剩下的数组进行一个翻转,让最后一列变成第一行,依次操作,即可得出最后答案。Java可以通过得到行列的长度,依次进行判断添加。【代码实现】# -*- coding:utf-8原创 2020-05-24 23:24:54 · 76 阅读 · 0 评论 -
剑指offer——11数值的整数次方(Python)
【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0【思路】此题较为简单,首先注意边界条件,还要分清大于0小于0的情况,然后可用递归来做,考虑到递归的时间复杂度较大,此处不做过多介绍。我们使用一个中间量来存储上一次平方运算的结果,循环与基数相乘即可。【代码】class Solution: def Power(self, base, exponent): # write原创 2020-05-23 13:29:36 · 120 阅读 · 0 评论 -
剑指offer——11二进制中1的个数(Python)
【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。【思路】将输入先转换为二进制,然后将其转化为字符串,逐位与 1比较,若等于1 ,结果加1。【代码实现】class Solution: def NumberOf1(self, n): # write code here #补码:正数不变,负数是它正数的反码+1 #0x表示16进制,F表示4个1 n = 0xFFFFFFFF & n #取一个数的补码的后3原创 2020-05-23 12:22:09 · 178 阅读 · 0 评论 -
剑指offer——10 矩形覆盖(Python)
【题目】我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?【思路】我们很容易得出n=1时,结果是1,n=2时,结果是2,n=3时:我们首先竖着放一块,剩下的就是一个n = 2的问题,有两种,如果我们横这放一块,这一块下面只能横着放一块,此时剩的位置就是一个n=1的问题。可以推导出分f(n) = f(n-1)+f(n-2)。眼熟的斐波那契数列,话不多说,上递归。注意特殊值:【代码实现】class Solution: d原创 2020-05-22 20:29:38 · 123 阅读 · 0 评论 -
剑指offer——22从上往下打印二叉树(Python)
【题目】从上往下打印出二叉树的每个节点,同层节点从左至右打印。【思路】本题是前序遍历二叉树,借助一个辅助列表,先将根节点放到结果列表中,然后然后对根节点判断是否有左右节点,将其左右节点放入辅助列表中,此时根节点处理过了将其删除,接着处理左节点,放到结果列表中,判断其子节点,依次往复,知道辅助列表为空。【代码实现】class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom(self, root):原创 2020-05-12 13:10:35 · 75 阅读 · 0 评论 -
剑指offer——18二叉树的镜像(Python)
【题目】操作给定的二叉树,将其变换为源二叉树的镜像。【思路】涉及到树的问题,基本都采用递归进行处理。首先进行边界判断。然后从根节点开始处理,将其左右节点互换,然后递归对其左右节点做相同的处理。【代码实现】class Solution: # 返回镜像树的根节点 def Mirror(self, root): # write code here if not root: return None root.left,ro原创 2020-05-12 12:20:57 · 123 阅读 · 0 评论 -
剑指offer——17树的子结构(Python)
【题目】输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)【思路】首先判断边界条件,然后遍历a树找到一个和b树根节点相同的节点,定义一个函数,如果根节点相同则判断它们的左节点和右节点,注意当节点相同时,b树的子节点为空时则返回True,【代码实现】class Solution: def HasSubtree(self, pRoot1, pRoot2): # write code here if pRoot1 == None原创 2020-05-11 21:42:23 · 83 阅读 · 0 评论 -
剑指offer——04重建二叉树(Python)
【题目】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。【思路】前序遍历是中左右的顺序,中序遍历是左中右的顺序。所以前序序列的第一个数1是根节点,在中序序列中找到1的位置,1的左边就是左子树的中序序列,1的右边是中序序列的右子树。此时,左子树的前序序列是{2,4,7}.中序序列是{4,7,2},。推理方法如上,2是根节点原创 2020-05-10 13:26:10 · 119 阅读 · 0 评论 -
剑指offer——40数组中只出现一次的数字(Python)
【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字【思路】简单的方法就是构建一个字典,key是数组中的数字,value是出现的次数,然后再遍历一遍,将value为1的数字取出放到列表里,最后输出该列表。【代码实现】class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here nu原创 2020-05-09 00:43:43 · 167 阅读 · 1 评论 -
剑指offer——33丑数(Python)
【题目】把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数【思路】因为丑数只包含质因子2,3,5,所以从1开始,后面的丑数都可看作由前面的丑数乘以2,3,5得来。首先令三个指针都指向1的位置,下标为0,然后对这三个指针的值分别乘以2,3,5,并比较大小,较小的添加到丑...原创 2020-05-07 23:59:35 · 436 阅读 · 0 评论 -
剑指offer——31整数中1出现的次数(Python)
【题目】求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。【思路】暴力方法,将所有数字连成一个字符串,然后挨个遍历,判断是否为1,该方...原创 2020-05-05 21:37:31 · 153 阅读 · 0 评论