![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
SmileLily0202
人不要忘记自己年轻时候的梦想
展开
-
剑指offer-数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:1、暴力比较,用双循环比较前后元素的大小,但是时间复杂度为O(n^2),太大了,通过不了2、先将原序列data排序,然后从排完序的数组datasort中取出最小的,它...原创 2020-12-15 14:48:41 · 111 阅读 · 0 评论 -
剑指offer-包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。'''用一个辅助栈来存放最小值 这个辅助栈工作原理: 入栈时,1)当数据栈为空时,进入栈的元素同时也进入辅助栈; 2)当它不为空时,就把该入栈元素与辅助栈的栈顶元素进行比较,若入栈元素小,则该元素同时也进入辅助栈;若不是,则对辅助栈不进行操作 ...原创 2019-05-06 13:23:11 · 63 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5 是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的 长度是相等的)# -*- coding:utf-8 -*-'''借用一个辅助的栈,遍历压栈...原创 2019-05-06 14:19:47 · 71 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列python
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:根据二叉搜索树的性质递归判断数组是否符合该性质,符合则输出yes,不符合则输出no二叉搜索树是对一个有序数组进行二分查找形成的搜索树,它指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点...原创 2019-05-10 11:28:05 · 726 阅读 · 0 评论 -
剑指offer-二叉树中和为某一个值的路径
题目描述:输入一颗二叉树的跟节点和一个整数expectNumber,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:此题需要注意的地方是题目所求路径应该是从根结点开始到叶子结点。定义数组onepath存放当前遍历的路径,定义patharray数组存放所有符合条件的路...原创 2019-05-10 13:14:56 · 112 阅读 · 0 评论 -
剑指offer-复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:第一步:在原有链表的基础上复制结点,将结点复制到原结点的后面 第二步:复制随机结点 第三步:将新旧链表分离# -*- coding:utf-8 -...原创 2019-05-10 15:37:34 · 80 阅读 · 0 评论 -
剑指offer-二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:由下图可知,二叉搜索树的中序遍历就是排序的数列,我们需要做的就是把当前节点的右子树设为下一个节点,下一个节点的左子树设为该节点图片来源:参考此篇博客# -*- coding:utf-8 -*-# class TreeNode:# def _...原创 2019-05-10 17:29:56 · 77 阅读 · 0 评论 -
剑指offer-连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-05-10 20:12:21 · 93 阅读 · 0 评论 -
剑指offer-左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!# -*- coding:utf-8 -*-class Solution: def ...原创 2019-05-10 21:22:18 · 131 阅读 · 0 评论 -
剑指offer-数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。# -*- coding:utf-8 -*-class Solution: def __in...原创 2019-05-10 21:37:29 · 74 阅读 · 0 评论 -
剑指offer-字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。# -*- coding:utf-8 -*-class Solution: def __in...原创 2019-06-13 16:46:36 · 87 阅读 · 0 评论 -
剑指offer-正则表达式匹配
题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路:模式第二个字符为‘*’字符串第一个字符与模式第一个字符匹配,考虑三种情况(其中...原创 2019-06-19 16:35:37 · 93 阅读 · 0 评论 -
剑指offer - 二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:题目说是中序遍历的下一个结点,就分为两种情况:1.当前结点有右子树,找到右子树的最左结点返回2.当前结点无右子树,则找到第一个当前结点是父节点的左孩子的父节点。程序如下:# -*- coding:utf-8 -*-# cl...原创 2019-07-13 22:07:08 · 86 阅读 · 0 评论 -
剑指offer-对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:对称二叉树的例图如下:从图中可以看出:对称二叉树的前序遍历为{8,6,5,7,6,7,5},对称二叉树的“根右左”遍历为{8,6,5,7,6,7,5};总结出:如果二叉树是对称二叉树,其前序遍历的结果与“根右左”遍历的结果相同。所以我们可以进行根...原创 2019-07-14 13:28:25 · 109 阅读 · 0 评论 -
剑指offer-按之字形顺序打印二叉树
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:顺序遍历二叉树,判断当前所在层是奇数层还是偶数层,如果是偶数层,就将节点序列reverse。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self,...原创 2019-07-14 18:17:52 · 104 阅读 · 0 评论 -
剑指offer-把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:从上到下遍历二叉树,利用列表存储二叉树每一层的节点,在读取列表中当前层节点的同时,存储下一层的节点,以此类推# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# ...原创 2019-07-14 18:37:16 · 100 阅读 · 0 评论 -
剑指offer-序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树思路:序列化二叉树:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串。需要注意的是,序列化二叉树的过程中,如果遇到空节点,需要以某种符号(这里用#)表示。以下图二叉树为例,序列化二叉树时,需要将空节点也存入字符串中。# -*- coding:utf-8 -*-# class TreeNode:# d...原创 2020-12-15 14:48:15 · 107 阅读 · 0 评论 -
剑指offer-二叉搜索树的第k个结点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:按中序遍历的方法遍历二叉搜索树得到的序列是从小到大递增的序列,最后通过下标及k匹配得到二叉搜索树中第k小的结点# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self,...原创 2019-07-14 19:21:01 · 88 阅读 · 0 评论 -
剑指offer-二叉树的镜像
题目描述:思路:利用递归实现左右节点的交换# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # 返回...原创 2019-05-06 10:18:25 · 65 阅读 · 0 评论 -
剑指offer-树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None...原创 2019-05-06 09:28:34 · 62 阅读 · 0 评论 -
剑指offer-第一次只出现一次的字符
题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).# -*- coding:utf-8 -*-class Solution: def FirstNotRepeatingChar(self, s): # write code here ...原创 2019-04-15 21:37:50 · 123 阅读 · 0 评论 -
剑指offer-表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E- 16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:第一反应是采用try...except的组合来处理转化不成数值的字符,一开始用的n=int(s),但是运行后发现不对,查了相关资料...原创 2019-04-15 21:56:31 · 114 阅读 · 0 评论 -
剑指offer-反转链表
题目描述:输入一个链表,反转链表后,输出新链表的表头。##剑指offer里的测试输入数据是链表类型# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回Lis...原创 2019-04-13 15:10:49 · 106 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def FindKthToTail(self, head, k):...原创 2019-04-13 15:07:43 · 85 阅读 · 0 评论 -
剑指offer-删除链表中重复的结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# se...原创 2019-04-16 13:11:23 · 95 阅读 · 0 评论 -
剑指offer-找出数组中的重复数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。# -*- coding:utf-8 -*-class Solution: # 这里要特别注意~找到任意重复...原创 2019-04-13 15:11:19 · 128 阅读 · 0 评论 -
剑指offer-和为s的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。# -*- coding:utf-8 -*-class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if len(ar...原创 2019-04-13 15:10:22 · 62 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变思路:创建两个空列表,一个存放全是奇数的数据,另一个存放全是偶数的数据,最后利用列表内置方法连接两个列表数组。# -*- coding:utf-8 -*-class Solution: def reOrde...原创 2019-04-13 15:08:42 · 67 阅读 · 0 评论 -
剑指offer-翻转单词顺序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?# -*- codin...原创 2019-04-13 15:09:57 · 169 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:遍历链表,顺序存放在列表中,再逆序输出列表即可# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solut...原创 2019-04-13 15:24:40 · 79 阅读 · 0 评论 -
剑指offer-合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。递归版本:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: ...原创 2019-04-14 13:35:30 · 74 阅读 · 0 评论 -
剑指offer-链表中环的入口结点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null思路:先通过快慢指针法判断链表是否存在环,此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),这次两个指针一次走一步,相遇的地方就是入口节点。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# ...原创 2019-04-14 14:13:36 · 58 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here if n >= 0: #对于正整数,将其转化成二进制数,然后求1的个数 ...原创 2019-04-14 16:13:01 · 78 阅读 · 0 评论 -
剑指offer-把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323class Solution: def PrintMinNumber(self, numbers): # write code here if not numbers: ...原创 2019-04-14 17:54:23 · 67 阅读 · 0 评论 -
剑指offer-求1+2+3+...+n
题目描述:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)# -*- coding:utf-8 -*-class Solution: def Sum_Solution(self, n): # write code here #方法一:利用sum()方法求和 ...原创 2019-04-18 15:16:56 · 135 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是先进后出,队列是先进先出。将栈A作为入队列,栈B作为出队列。栈A用来作入队列 栈B用来出队列,当栈B为空时,栈A全部出栈(将元素入栈的顺序翻转了)到栈B,栈B再出栈(即出队列,顺序就变成了先进先出了) class Solution: def __init__(self):...原创 2019-04-23 12:00:07 · 104 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:最主要的还是找规律,类似斐波那契序列问题斐波那契序列问题的解决方法有两种,一种递归循环,另一种一种非递归循环。# -*- coding:utf-8 -*-'''最主要的还是找规律,类似斐波那契序列问题'''class Solution:...原创 2019-05-04 16:41:10 · 81 阅读 · 0 评论 -
剑指offer-两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的第一个公共结点。思路:首先遍历第一个链表,把所有的结点存放在列表A中,接着遍历另一个链表,每一个结点判断一下是否存在于列表A中,如果存在,则存在公共结点,输出第一个公共结点# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x...原创 2019-04-15 21:26:14 · 80 阅读 · 0 评论