![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
北落师门XY
这个作者很懒,什么都没留下…
展开
-
20180322剑指offer题3——二维数组中的查找
一.要求 二维数组,从左到右,从上到下递增,判断其中是否有某个特定的值,此类二维数组如下所示二.相关概念 注意题目要求的是数组array,在main函数中使用A=[[],[]...]即可完成初始化,不要做成矩阵的方法三.思路 从右上角开始查找,大于目标则去掉该列,左移查找位;小于目标则去掉该行,下移查找位。本题也可以从左下角开始查找,遇到新题型,通过实例寻找解题方法。四.程序#修改前...原创 2018-03-22 22:13:10 · 106 阅读 · 0 评论 -
20180702剑指offer题17——合并两个排序的链表
一、要求 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二、思路及代码注意某个链表为空的情况,采用迭代法。迭代法的返回点是node.next=None,反应在程序中是 head1==Noneclass ListNode(): def __init__(self,value=None): self.val=value ...原创 2018-07-03 16:13:50 · 98 阅读 · 0 评论 -
20180723剑指offer题27——二叉搜索树与排序双向链表
一、要求将二叉搜索树转化成一个排序的双向链表,不能创建新节点只能调整树中结点的指向 二、思路及代码 二叉搜索树中节点原来有三个属性:val,left,right。转换到双向链表后,left/right改变定义,变成前/后。采用迭代的思想,根节点左边连接左子树最大值(最右节点),根节点右边连接右子树最小值(最左节点)迭代过程如上图所示,从低层到高层,修改二叉搜索...原创 2018-07-23 11:00:10 · 159 阅读 · 0 评论 -
20180723剑指offer题28——字符串的排列
一、要求输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。结果请按字母顺序输出。二、思路及代码 用for i in XXX递归+replace实现def solution(string): newstring=[] result=[...原创 2018-07-23 15:29:41 · 119 阅读 · 0 评论 -
20180723剑指offer题28扩展——字符串的组合
一、要求输入‘abc’输出'a', 'ab', 'abc', 'ac', 'b', 'bc', 'c注意:ab和ba属于不同的排列, 但属于同一个组合二、思路及代码 举个例子:输入acbc 迭代的处理过程:step1:排列一下acbc——abccstep2:最外层for,及那个判重复操作(if i>0 and str[i]==str[i-1]),决定...原创 2018-07-23 17:35:24 · 229 阅读 · 0 评论 -
20180723剑指offer题29——数组中出现次数超过一半的数字
一、要求 举个例子:输入:[1, 2, 3, 2, 2, 2, 5, 4, 2]输出:2二、思路及代码数组中出现次数超过一半的肯定只有1个数组,满足超过一半即可返回,不需要全部计数后判断用字典进行辅助def solution(L): num={} for i in L: if i in num:#简单写法:num[i]+=1 if nu...原创 2018-07-23 17:51:21 · 97 阅读 · 0 评论 -
20180723剑指offer题30——最小的k个数
一、要求 举个例子:输入:[4,5,1,6,2,7,3,8]输出:1,2,3 不要求顺序 二、思路及代码当数据较少时,有很多方法可以实现,min啊,排序啊,堆的nsmallest函数啊当数据较多时,考虑到内存,用一个堆实现,python自带最小堆库heapq,对输入数据取负可变成最大堆,处理成最大堆的意义在于调整堆顶元素时比较方便。最小堆:所有父节点的值都比...原创 2018-07-23 20:35:08 · 180 阅读 · 0 评论 -
20180723剑指offer题31——连续子数组的最大和
一、要求输入一个整型数组,数组值有正有负,举个例子输入:[1, -2, 3, 10, -4, 7, 2, -5]其中的连续子数组3,10,-4,7,2 得到最大和18二、思路及代码这个数组有正有负,那么最大和至少为正数,有点赌徒心态:(1)假设一段连续子数组的和是正数,那么就有涨的希望,下一个是正是负没关系,都先存起来(2)假设一段连续子数组的和是负数,跌停了,不要了...原创 2018-07-23 21:13:07 · 113 阅读 · 0 评论 -
20180723剑指offer题32——从1到n整数中1出现的次数
一、要求求从1到n整数的十进制表示中,1出现的次数。举个例子:1~13中包含1的数字有1、10、11、12、13因此共出现6次。二、思路及代码道理蛮复杂的,具体可看:https://blog.csdn.net/u012505432/article/details/51889052但是我不太同意作者“而如果某位位数字为0 < 1,则需要舍弃这一位的情况。”的做法我的...原创 2018-07-23 22:04:59 · 175 阅读 · 0 评论 -
20180703剑指offer题20——顺时针打印矩阵
一、要求 对矩阵进行蚊香式打印例如,如果输入如下矩阵:[[ 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.二、思路及代码 蚊香式一圈一圈打印,每一圈分成四笔完成(左右,...原创 2018-07-21 22:42:55 · 142 阅读 · 0 评论 -
20180722剑指offer题21——包含min函数的栈
一、要求 栈的push,pop,min操作的时间复杂度都是O(1)二、思路及代码 用两个list实现,stack用来做正常的入栈出栈,minStack用来保存当前栈的最小值。需要注意的是,minStack不是对所有栈中的数据进行排序 :如果push的数字小于minStack栈顶的数字,在minStack中push更小的新数据;否则,在minStack中push把旧的最小数(...原创 2018-07-22 10:48:11 · 94 阅读 · 0 评论 -
20180722剑指offer题22——栈的压入、弹出序列
一、要求输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、思路及代码建立一个辅助栈,对压入序列用for压入,每压入一个数,判断栈顶...原创 2018-07-22 11:13:15 · 100 阅读 · 0 评论 -
20180722剑指offer题23——从上往下打印二叉树
一、要求 从上往下打印出二叉树的每个节点,同层节点从左至右打印。相当于深度优先按层遍历, 中间需要队列做转存。二、思路及代码广度优先搜索,用一个队列进行存贮,从左到右,pop一个就print一个,并把这个节点的左右子节点排队到最后。另一个队列一直append要输出的值。class TreeNode: def __init__(self, x): se...原创 2018-07-22 13:55:25 · 100 阅读 · 0 评论 -
20180722剑指offer题24——二叉搜索树的后序遍历序列
一、要求判断给定的整数数组是不是二叉搜索树的后序遍历序列整数数组中不包含重复值 二、思路及代码 对数组三分,根据小大中的特点分成三段,每段区间为[0:left],[left,right],[-1]迭代处理。注意:1.没有左子树(left==0)和没有右子树(left==right)的情况2.如果不满足小大中三段的要求,right最后不能达到length-1d...原创 2018-07-22 14:39:41 · 93 阅读 · 0 评论 -
20180722剑指offer题25——二叉树中和为某一值的路径
一、要求 输入一棵二叉树和一个值,求从根结点到叶结点的和等于该值的路径二、思路及代码 递归思想,逐层计算各节点往下的sum需要多少,直到叶节点判断val和减剩下的sum是否相等,需要注意的是没有说val就一定大于0,所以分支限界在本题是不存在的。程序运行过程:向下向下向下——遇到叶子节点——哇,val等于sum,返回该节点值[[val]]/哦,不相等啊,返回个空的[]——返...原创 2018-07-22 16:16:23 · 107 阅读 · 0 评论 -
20180709剑指offer题19——二叉树的镜像
一、要求 二叉树的镜像效果如下图所示二、思路及代码 使用迭代法,考虑空树及没有左右子树(例如叶节点及单个孤立节点)的输入class TreeNode: def __init__(self,value=None): self.val=value self.left=None self.right=Nonedef solution(r...原创 2018-07-09 16:00:01 · 101 阅读 · 0 评论 -
20180702剑指offer题16——反转链表
一、要求 举个例子:链表内容为1,2,3,4,5,反转后为5,4,3,2,1二、思路及代码 对链表的操作注意特殊情况:单个孤立节点、空链表时间复杂度O(n)即可实现,用3个节点变量实现class ListNode(): def __init__(self,value=None): self.val=value self.next=Nonedef r...原创 2018-07-02 16:38:35 · 147 阅读 · 0 评论 -
20180325剑指offer题4——空格替换
一、要求 实现一个函数,将一个字符串中的空格替换成“%20”。 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。二、思路及代码 此题有多种解法,需要和面试官沟通好,是否接受直接调用replace函数的做法,是否认可正则化的做法,是否可以另外新建字符串做,是否必须在原存储空间实现。以此分为多种解法:方法一:调用replace函数A='W...原创 2018-03-25 22:47:34 · 137 阅读 · 0 评论 -
20180321剑指offer题2——单例模式SingleTon
一、要求 设计一个类,只能生成该类的一个实例二、相关概念单例模式的概念:单例模式是设计模式的一种,一个类只有一个实例。 new 方法: new 方法创造一个类的实例,最后需要返回相应类的实例( init 方法实现初始化)。新式类开始实例化时,new()方法会返回cls(cls指代当前类)的实例,然后该类的 init()方法作为构造方法会接收这个实例(即self)作为自...原创 2018-03-21 22:44:41 · 138 阅读 · 0 评论 -
20180521剑指offer题5——从头到尾打印链表
一、要求 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。二、思路及代码在本题中,对输入进行了多个节点构成链表、单个孤立节点、单个空节点进行了详细的测试方法一:使用insert函数:insert(a,b)可在列表的a位置插入b方法二:使用pop函数从尾到头输出列表方法三:使用递归,遇到空节点返回进行输出 #建立链表类class ListNode():...原创 2018-06-25 20:41:03 · 145 阅读 · 0 评论 -
20180629剑指offer题7——用两个栈实现队列
一、要求 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。二、思路及代码三、思考与总结原创 2018-06-30 19:20:58 · 92 阅读 · 0 评论 -
20180630剑指offer题9——斐波那契数列
一、要求 不使用递归实现斐波那契数列二、思路及代码用两个变量def solution(num): a=0 b=1 for i in range(0,num): print(b) a,b=b,b+asolution(7)三、运行结果D:\Anaconda\envs\Tensorflow\python.exe C:/Users/Admi...原创 2018-06-30 22:15:53 · 119 阅读 · 0 评论 -
20180630剑指offer题10——二进制中1的个数
一、要求 求一个整数的二进制表示中1的个数。举个例子:输入为9,表示为二进制为1001,有2位是1,输出2二、思路及代码 首先要知道非零整数n一个神奇的按位与操作:n&(n-1),可以将最低位的1变为0,其他位不变。不断进行这么个操作直到n%(n-1)==0,可以得到1的个数def solution(n): num=0 while n!=0: n=n...原创 2018-06-30 22:29:41 · 128 阅读 · 0 评论 -
20180630剑指offer题11——数值的整数次方
一、要求 求base的exponent次方,如(2,4)输出16,(2,-3)输出0.125二、思路及代码 几个知识点:python中将数据转化为二进制:bin(num)按位与,计算数据二进制形式中1是奇数个还是偶数个:num&1数据右移1位,实现除以2取整操作:num>>1判断一个数是否等于0,不能直接写a==0,因为计算机表示小数有误差,可用a-0.0<0.00...原创 2018-07-01 13:52:30 · 151 阅读 · 0 评论 -
20180701剑指offer题12——打印1到最大的n位数
一、要求 例如输入3,输出0~99二、思路及代码python 的指数表示为 a ** n(a的n次方) 0~99在程序中可以用range(10 ** 2)表示def print_max_n(n): if type(n)!=int: print ('typeError') return if n<=0: print ('n ...原创 2018-07-01 14:07:10 · 132 阅读 · 0 评论 -
20180701剑指offer题13——O(1)时间删除链表节点
一、要求 给链表的头结点和要删除的节点二、思路及代码 由于单链表只能向后,不能向前,所以会造就要删的节点空间保存,下一个节点遭殃的情形,如下图所示: 根据只能向后的特性,对删除节点的位置进行分类讨论:1、是尾节点也是头结点,即只有一个节点2、是尾节点,没有下一个节点.需要找到前一个节点3、普通节点 class ListNode(): ...原创 2018-07-01 15:28:51 · 119 阅读 · 0 评论 -
2018001剑指offer题14——调整数组顺序使奇数位于偶数前面
一、要求 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。二、思路及代码 def solution(x): a=[i for i in x if i & 1] b=[i for i in x if not i&1 ] print(a...原创 2018-07-01 16:01:58 · 84 阅读 · 0 评论 -
2018001剑指offer题15——链表中倒数第k个节点
一、要求 输出链表中数据的倒数第k个节点的val二、思路及代码 用两个间隔k-1的指针(快慢指针),一前一后移动,当前面一个移动到尾指针时输出val。需要注意几种特殊情况:1、k超过了链表长度2、k小于等于0,k不是int型3、链表为空 class ListNode(): def __init__(self,value=None): ...原创 2018-07-01 17:26:09 · 111 阅读 · 0 评论 -
20180630剑指offer题8——旋转数组的最小数字
一、要求 把一个数组的最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。二、思路及代码 顺序查找时间复杂度高,采用二分法不断减小搜索区域能减小复杂度。按照题意,若发生旋转,首元素必然大于等于尾元素,二分法结合分类讨论:情况一:当首元素小于尾元素:最...原创 2018-06-30 22:01:49 · 104 阅读 · 0 评论 -
20180629剑指offer题6——重建二叉树
一、要求 输入前序遍历和中序遍历,重建二叉树并输出它的头结点。前序[1, 2, 3, 5, 6, 4],中序 [5, 3, 6, 2, 4, 1],要构建的树为二、思路及代码前序第一个值为根节点,在中序中找到位置后,可将左右分支拆分出来,利用迭代法重建树class TreeNode: #建立二叉树类 def __init__(self,x=None): self.valu...原创 2018-06-29 21:27:55 · 134 阅读 · 0 评论 -
20180703剑指offer题18——树的子结构
一、要求 判断一棵树tree2是不是另一棵树tree1的子结构,空树不是任意一个树的子结构。二、思路及代码需要进行的判断:1.都不是None,判断val,再进一步判断(左右进一步看val,或者左右重新判断)2.tree1是空而tree2非空 ,return false3.tree2已是空,return true4.一开始就遇到空节点val==None:不论是tree1还是tree2 retu...原创 2018-07-09 09:21:57 · 94 阅读 · 0 评论 -
20180722剑指offer题26——复杂链表的复制
一、要求输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。值得注意的是,像节点D的randomnext就是None,不是所有节点都有randomnext的非空节点二、思路及代码三步走step1:在原节点后插入新建节点,注意不能用=来新建节点step2:对新节点完善randomne...原创 2018-07-22 17:15:44 · 105 阅读 · 0 评论