![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer编程题
CC‘s World
这个作者很懒,什么都没留下…
展开
-
【剑指offer】数据流的中位数 -- Python 实现
【题目描述】如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。【解题思路】举一个例子:比如1,2,3,4,5,6,7,8的中位数是4和5的平均值,4是前一半的最大值,5是后一半的最小值。这给我们的启示是,可以用优先队列来解这道题,维护一个大根堆和一个小根堆,使用大根堆存储比原创 2020-05-22 17:05:26 · 275 阅读 · 0 评论 -
【剑指offer】序列化二叉树 -- Python 实现
【题目描述】请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过原创 2020-05-21 23:53:24 · 299 阅读 · 0 评论 -
【剑指offer】机器人的运动范围 -- Python 实现
【题目描述】地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?【解题思路】此题有两种实现方式,一种是dfs递归求解,一种是直接遍历,直接遍历的方法较为简单,所以这里阐述用dfs递归求解的方法,由于是从坐标0,0的原创 2020-05-21 21:07:54 · 183 阅读 · 0 评论 -
【剑指offer】矩阵中的路径 -- Python 实现
【题目描述】请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如a b c es f c sa d e e矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。【解题思路】用递归来解这道题。用一个全局变原创 2020-05-21 20:04:43 · 250 阅读 · 0 评论 -
【剑指offer】二叉搜索树的第k个结点 -- Python 实现
【题目描述】给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。【解题思路】二叉搜索树的定义就是:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。此题有两种解法,法一就是使用递归的方法中序遍历二叉树,将结果都存在一个数组中,递归遍历完成后,输出索引为k-1的结点,用Python实现的代码如下:# -*-原创 2020-05-20 19:17:57 · 243 阅读 · 0 评论 -
【剑指offer】链表中环的入口结点 -- Python 实现
【题目描述】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。【解题思路】设置一快一慢两个指针,快指针一次走两步,慢指针一次走一步。如果存在环,则两个指针一定会相遇。如图所示,设起始结点到入口结点的距离为a,入口结点到相遇结点的距离为b,相遇结点绕回入口结点的距离为c。在两个指针相遇时,慢指针走了a+b,因而快指针走了2(a+b),从快指针步数的角度看,快指针走了a+k(b+c)+b,也就是说两个指针相遇时,快指针比慢指针多走了k圈(注意这里不一定是多走了一圈,考虑一种极原创 2020-05-20 17:42:35 · 389 阅读 · 0 评论 -
【剑指offer】二叉树的下一个结点 -- Python 实现
【题目描述】给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。【解题思路】如上图所示,要想求得已知结点的下一个结点,有三种可能的情况:若该结点有右子树,则该结点的下一个结点是其右子树的最左结点,例如3的下一个结点是7,2的下一个结点是5,1的下一个结点是3;若该结点没有右子树,且该结点是其父结点的左孩子,则该结点的下一个结点是其父结点,例如4的下一个结点是2,7的下一个结点是6;若该结点没有右子树,则一直往父原创 2020-05-20 14:13:35 · 211 阅读 · 0 评论 -
【剑指offer】按之字形顺序打印二叉树 -- Python 实现
【题目描述】请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。【解题思路】这道题建立在【剑指offer】把二叉树打印成多行的基础上,只要在偶数行取反即可,用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left原创 2020-05-19 22:27:00 · 146 阅读 · 0 评论 -
【剑指offer】把二叉树打印成多行 -- Python 实现
【题目描述】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。【解题思路】首先,按层打印二叉树即是二叉树的层序遍历,用队列实现即可。本题要求每一层输出一行,就需要多加一个层次信息,所以需要额外创建一个保存结点层次信息的队列,和结点队列同步出队入队即可。相同层次的结点保存在一个temp变量中,将所有的temp存储到res中,最终返回res即可。用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init_原创 2020-05-19 22:12:35 · 141 阅读 · 0 评论 -
【剑指offer】和为S的连续正数序列 -- Python 实现
【题目描述】小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序【解题思路】用双指针法实现,前后各一个指针。当前序列的和用等原创 2020-05-19 20:07:12 · 158 阅读 · 0 评论 -
【剑指offer】数组中的逆序对 -- Python 实现
【题目描述】在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007【解题思路】用归并排序来求解这道题,在合并左右连个数组left和right时,如果left当前位置的元素小于right当前位置的元素,则把left当前位置的元素加入到res中,并将left的指针l右移一位;如果right当前位置的元素小于left当前位置的元素,则把right当前位置的元素加原创 2020-05-19 17:04:18 · 235 阅读 · 0 评论 -
【剑指offer】字符串的排列 -- Python 实现
【题目描述】输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc, acb, bac, bca, cab 和 cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。【解题思路】这道题用递归来实现——把字符串分为两部分:字符串的第一个字符字符串中剩下的字符递归实现方式为:遍历字符串,求出所有可能在第一个位置出现的字符,此处需要注意去重求剩下的字符的全排列,这部分继续用递归实原创 2020-05-19 15:21:24 · 181 阅读 · 0 评论 -
【剑指offer】对称的二叉树 -- Python 实现
【题目描述】请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。【解题思路】用递归的方法求解,根节点的值要相等,左子树要和右子树对称才是一个对称的二叉树。如果直接在一棵树上操作,无法实现,所以看两个相同的树是否对称即可。用Python实现的代码如下:class Solution: def isSymmetrical(self...原创 2020-04-14 21:59:09 · 125 阅读 · 0 评论 -
【剑指offer】二叉搜索树与双向链表 -- Python 实现
【题目描述】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。【解题思路】二叉搜索树中序遍历就是有序的,所以先将二叉树中序遍历的节点存储到列表中,然后对列表中的节点进行前后链接处理即可,用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __ini...原创 2020-04-14 19:25:42 · 168 阅读 · 0 评论 -
【剑指offer】复杂链表的复制 -- Python 实现
【题目描述】输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)【解题思路】从头到尾复制链表即可,只是多了一项随机指针,不影响什么。用Python实现的代码如下:# -*- coding:utf-8 -*-# class Ran...原创 2020-04-14 17:42:25 · 117 阅读 · 0 评论 -
【剑指offer】二叉树中和为某一值的路径 -- Python 实现
【题目描述】输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)【解题思路】此题是树的深度优先遍历,遍历左右子树时,用期望值减去根节点的值进行递归即可。用Python实现的代码如下:# -*- coding:utf-8 -*-# class...原创 2020-04-14 17:27:36 · 170 阅读 · 0 评论 -
【剑指offer】删除链表中重复的节点 -- Python 实现
【题目描述】在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5【解题思路】由于链表不便操作,所以先处理成一个不存在重复元素的列表,然后再根据列表重建链表。思路如下:1.为了删除重复的元素,采用栈,如果当前元素和栈顶元素不相...原创 2020-04-14 11:40:32 · 204 阅读 · 1 评论 -
【剑指offer】数字在排序数组中出现的次数 -- Python 实现
【题目描述】统计一个数字在排序数组中出现的次数。【解题思路】二分法找到出现该元素的位置,然后从该位置起前向后向分别查找。用Python实现的代码如下:# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code here cnt = 0 ...原创 2020-04-14 10:55:41 · 215 阅读 · 0 评论 -
【剑指offer】两个链表的第一个公共节点 -- Python 实现
【题目描述】输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)【解题思路】这道题有一个需要注意的地方就是:凡是两个链表中出现了一样的节点,那么该节点一定是公共节点,往后的一定是一样的。用Python实现的代码如下:# -*- coding:utf-8 -*-# class ListNode:# de...原创 2020-04-13 22:53:02 · 207 阅读 · 0 评论 -
【剑指offer】平衡二叉树 -- Python 实现
【题目描述】输入一棵二叉树,判断该二叉树是否是平衡二叉树。【解题思路】平衡二叉树:平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。一种直观的思路是采用双重递归,第一层递归是判定该节点及其左右子树是否都是平衡二叉树,第二层递归是计算该节点的左右子树的深度,用Python实现的代码如...原创 2020-04-13 22:09:16 · 192 阅读 · 0 评论 -
【剑指offer】二叉树的深度 -- Python 实现
【题目描述】输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。【解题思路】递归求左子树和右子树的深度即可。用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x...原创 2020-04-13 21:37:34 · 118 阅读 · 0 评论 -
【剑指offer】滑动窗口的最大值 -- 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...原创 2020-03-17 12:13:52 · 204 阅读 · 0 评论 -
【剑指offer】最小的k个数 -- Python 实现
【题目描述】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【解题思路】排序即可,用Python实现的代码如下:# -*- coding:utf-8 -*-class Solution: def GetLeastNumbers_Solution(self, tinput, k): # wri...原创 2020-03-17 11:45:29 · 86 阅读 · 0 评论 -
【剑指offer】二叉搜索树的后序遍历序列 -- Python 实现
【题目描述】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。【解题思路】二叉搜索树的性质是:其左子树中每个节点的值<根节点的值<右子树中每个节点的值。一个后序遍历序列的最末尾的数字为二叉树的根节点,所以找到第一个小于根节点的位置idx,分出左右子树,如果sequence[:idx]中存在大...原创 2020-03-15 19:47:20 · 128 阅读 · 0 评论 -
【剑指offer】从上往下打印二叉树 -- Python 实现
【题目描述】从上往下打印出二叉树的每个节点,同层节点从左至右打印。【解题思路】这道题是二叉树的层次遍历,需要借助队列来实现。层次遍历二叉树的步骤为:根节点入队列,队列首元素出队列,首元素的左右子树入队列,一直重复这个过程,直到队列为空。用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(...原创 2020-03-15 18:35:16 · 127 阅读 · 0 评论 -
【剑指offer】二叉树的镜像 -- Python 实现
【题目描述】操作给定的二叉树,将其变换为源二叉树的镜像。【解题思路】递归实现镜像操作,从树根到叶子结点依次交换左右子树即可,用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = Non...原创 2020-03-15 17:49:42 · 133 阅读 · 0 评论 -
【剑指offer】树的子结构 -- Python 实现
【题目描述】输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)【解题思路】深度遍历A,如果A的某个节点和B的根节点相同,则判断B是否为以A的这个节点为根节点的树的子结构。注意以下这种情况,B为A的子结构用Python实现的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init...原创 2020-03-10 20:10:53 · 113 阅读 · 0 评论 -
【剑指offer】重建二叉树 -- Python 实现
【题目描述】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。【解题思路】前序遍历二叉树是先遍历根节点,然后左子树,最后右子树中序遍历二叉树是先遍历左子树,然后根节点,最后右子树所以我们递归重建二叉树:...原创 2020-03-10 18:48:33 · 103 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列 -- Python 实现
【题目描述】输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)【解题思路】建一个新的栈stack,将第一个序列的数字依次压入stack,在压栈...原创 2020-03-09 19:01:18 · 129 阅读 · 0 评论 -
【剑指offer】包含min函数的栈 -- Python 实现
【题目描述】定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。【解题思路】令开一个栈min_stack,保存那些曾经做过最小值的值,在pop的过程中,如果min_stack的栈顶元素和stack的栈顶元素相等,则二者都要出栈,否则只让stack的栈顶元...原创 2020-03-09 18:28:13 · 145 阅读 · 0 评论 -
【剑指offer】用两个栈实现队列 -- Python 实现
【题目描述】用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。【解题思路】Python有内置的pop()操作,如图所示所以这道题的思路是,在push操作时用两个栈实现队列,在pop操作时直接pop出队列即可。在push操作时用两个栈实现队列的思路是:建立两个stack,一个stack其实就是最终的队列,另一个stack_tmp用来暂存stack中的元素...原创 2020-03-09 17:32:51 · 162 阅读 · 0 评论 -
【剑指offer】孩子们的游戏 -- Python 实现
【题目描述】每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最...原创 2020-03-07 20:43:13 · 144 阅读 · 0 评论 -
【剑指offer】二进制中1的个数 -- Python 实现
【题目描述】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。【解题思路】一个整数在内存中占4个字节,一个字节等于8个比特,所以一个整数在内存中存储时占32位,逐渐右移与看每一位是否为1即可。用Python实现的代码如下:# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # w...原创 2020-03-07 19:48:49 · 126 阅读 · 1 评论 -
【剑指offer】合并两个排序的链表 -- Python 实现
【题目描述】输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。【解题思路】新建一个排序链表,不断插入两个链表中较小的节点。因为要新建一个列表,所以一开就建立一个元素为0的节点,令一个指针p指向它,最终返回p.next即是排序链表。用Python实现的代码如下:# -*- coding:utf-8 -*-# class ListNode:# ...原创 2020-03-03 18:44:59 · 78 阅读 · 0 评论 -
【剑指offer】反转链表 -- Python 实现
【题目描述】输入一个链表,反转链表后,输出新链表的表头。【解题思路】新建一个链表,然后遍历输入的链表,不断让新链表下一次的next值指向当前新创建的链表表头,用Python实现的代码如下:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# ...原创 2020-03-01 11:20:46 · 186 阅读 · 0 评论 -
【剑指offer】链表中倒数第k个节点 -- Python 实现
【题目描述】输入一个链表,输出该链表中倒数第k个结点。【解题思路】对于长度为n的链表,倒数第k个节点就是正数第n-k个节点。所以此题可以设置两个指针front和behind。先让front指针走到第k个节点,然后front和behind同时走,当front走完的时候,behind就走到了第n-k个节点,也就是倒数第k个节点,用Python实现的代码如下:# -*- coding:utf...原创 2020-02-29 23:46:32 · 149 阅读 · 0 评论 -
【剑指offer】从尾到头打印链表 -- Python 实现
【题目描述】输入一个链表,按链表从尾到头的顺序返回一个ArrayList。【解题思路】此题用Python的insert()很好实现。新开一个存储结果的列表。遍历链表,每走到一个数字就把它插到列表的最前面。代码如下:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val ...原创 2020-02-29 23:09:31 · 158 阅读 · 0 评论 -
【剑指offer】剪绳子 -- Python 实现
【题目描述】给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述:输入一个数n,例如8输出描述:输出答案,例如输入为8时,输出为18...原创 2020-02-27 17:14:57 · 859 阅读 · 0 评论 -
【剑指offer】字符流中第一个不重复的字符 -- Python 实现
【题目描述】题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。输入:google输出:ggg#ll【解题思路】扫描两次字符串:第一次,用字典记录每个字符...原创 2020-02-27 16:28:36 · 132 阅读 · 0 评论 -
【剑指offer】表示数值的字符串 -- Python 实现
【题目描述】请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。【解题思路】考虑有数字中带有e的和不带有e的。对于不带有e的数字,判断其是否合法的标准是,是否有超过一个小数点,如果有正负号的话正负号...原创 2020-02-27 15:59:47 · 247 阅读 · 0 评论