剑指offer系列
励志学好数据结构
哼哼
展开
-
剑指offer
现对这66道题目进行了粗略的划分,整理如下:数组(11道):剑指Offer_编程题01:二维数组中的查找剑指Offer_编程题06:旋转数组的最小数字(指针)剑指Offer_编程题13:调整数组顺序使奇数位于偶数前面剑指Offer_编程题28:数组中出现次数超过一半的数字剑指Offer_编程题30:连续子数组的最大和剑指Offer_编程题32:把数组排成最小的数剑指...原创 2018-08-15 15:09:13 · 781 阅读 · 0 评论 -
剑指Offer_编程题59:按之字顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。牛客网:链接有两种方法。第一种:按序获取每一层节点的值;然后将偶数层节点的值倒序。无论哪种方法,都是在剑指Offer_编程题60:把二叉树打印成多行上修改。# -*- coding:utf-8 -*-# class TreeNode:...原创 2018-09-29 17:26:44 · 156 阅读 · 0 评论 -
剑指Offer_编程题63:数据流中的中位数(堆)
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。牛客网:链接参考链接:点这里呀思路:如果能够保证数据容器左边的数据都小于右边的数据,那么即使左、右两...原创 2018-09-13 16:33:28 · 173 阅读 · 0 评论 -
剑指Offer_编程题05:用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。牛客网:链接LeetCode:LeetCode232:Implement Queue using Stacks要多思考,不像想象中那样简单。需要两个栈Stack1和Stack2,push的时候直接push进Stack1。pop需要判断Stack1和Stack2中元素的情况,Stack2有值,直...原创 2018-09-09 20:16:48 · 173 阅读 · 0 评论 -
剑指Offer_编程题52:正则表达式匹配
题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。牛客网:链接当模式中的第二个字符是*时: 1、如果第一个字符可以匹配,那么字符串模式后...原创 2018-09-08 11:20:12 · 189 阅读 · 0 评论 -
剑指Offer_编程题02:替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。牛客网:链接首先,要明确一点,字符串有下标操作的。所以s[i]这种也可以。但是要记住,是不可以赋值的!!s[i]=4是绝对不可以的!!所以要转成list进行操作!!!其次,for each in s: each=20 这种是...原创 2018-08-24 19:49:35 · 162 阅读 · 0 评论 -
剑指Offer_编程题25:复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)牛客网:链接参考链接:点击这里大部分人首先想到的可能是先复制复杂指针的label和next,然后再查找random并更新。查找random又分为两种,一种是每次都从头查...原创 2018-08-22 11:25:16 · 171 阅读 · 0 评论 -
剑指Offer_编程题03:从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。牛客网:链接# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回从尾部到头部的列表...原创 2018-08-22 08:23:56 · 151 阅读 · 0 评论 -
剑指Offer_编程题06:旋转数组的最小数字(二分法)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。牛客:链接LeetCode变体:LeetCode153:Find Minimum in Rotated So...原创 2018-08-15 20:48:19 · 235 阅读 · 0 评论 -
剑指Offer_编程题01:二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。牛客网:链接首先选取数组中右上角的数字。如果要选左上角的数字,target比它大,是应该向右找还是应该向左找呢?这个是不确定的。所以应该从可以确定方向的数字开始找其。如果该数字等于要查找的数...原创 2018-08-15 16:38:57 · 266 阅读 · 0 评论 -
剑指Offer_编程题55:链表中环的入口结点
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。牛客网:链接LeetCode同题:LeetCode141:Linked List Cycle LeetCode142:Linked List Cycle II使用快慢指针,一个每次走一步,一个每次走两步。如果两个指针相遇,表明链表中存在环,并且两个指针相遇的结点一定在环中。随后,再用一个指针从头结点...原创 2018-07-28 13:57:44 · 252 阅读 · 0 评论 -
剑指Offer_编程题54:字符流中第一个不重复的字符
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。牛客网:链接将字节流保存起来,通过哈希表统计字符流中每个字符出现的次数,顺便将字符流保存在string中,然后再遍历string,从哈希表中找到第一个出现一次的字符。具体实现...原创 2018-07-27 21:32:42 · 407 阅读 · 0 评论 -
剑指Offer_编程题53:表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。牛客网:链接思路:考虑所有可能出现的情况。判断原创 2018-07-27 20:45:25 · 150 阅读 · 0 评论 -
剑指Offer_编程题15:反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。牛客网:链接LeetCode同题:LeetCode206:Reverse Linked List直接交换指针。设置last为None,然后交换指针。更新last和head。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# ...原创 2018-07-16 08:50:31 · 187 阅读 · 0 评论 -
剑指Offer_编程题56:删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5牛客网:链接LeetCode同题:LeetCode82:Remove Duplicates from Sorted List IILeetCode变题:LeetC...原创 2018-07-21 10:51:25 · 251 阅读 · 0 评论 -
剑指Offer_编程题64:滑动窗口的最大值(双向队列)
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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...原创 2018-09-13 16:49:50 · 340 阅读 · 0 评论 -
剑指Offer_编程题07:斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39牛客网:链接可以用递归的方法做,但是递归的方法存在着严重的效率问题。所以有些题,能不用递归做,就不用递归做!# -*- coding:utf-8 -*-class Solution: def Fibonacci(self, n): ...原创 2018-09-13 18:47:40 · 193 阅读 · 0 评论 -
剑指offer练习
数组(11道):剑指Offer_编程题01:二维数组中的查找剑指Offer_编程题06:旋转数组的最小数字剑指Offer_编程题13:调整数组顺序使奇数位于偶数前面剑指Offer_编程题28:数组中出现次数超过一半的数字剑指Offer_编程题30:连续子数组的最大和剑指Offer_编程题32:把数组排成最小的数剑指Offer_编程题35:数组中的逆序对(归并排序)剑...原创 2018-09-20 09:00:34 · 346 阅读 · 2 评论 -
剑指Offer_编程题58:对称的二叉树
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。牛客网:链接二叉树的镜像和对称二叉树的区别: 源二叉树 8 / \ 6 10 ...原创 2018-09-29 17:05:38 · 136 阅读 · 0 评论 -
剑指Offer_编程题39:平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。牛客网:链接平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。利用38题二叉树的深度求解。按照平衡二叉树的定义,有两点需要注意:1,每个节点的两个子树...原创 2018-09-29 16:38:18 · 140 阅读 · 0 评论 -
剑指Offer_编程题38:二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。牛客网:链接思路:如果一棵树只有一个节点,那么它的深度是1。如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1,;同样,如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1。如果既有右子树又有左子树,那么树的深度就是其左、右子树...原创 2018-09-29 16:22:57 · 152 阅读 · 0 评论 -
剑指Offer_编程题24:二叉树中和为某一值的路径(DFS)
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点(必须从根到叶)形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)牛客网:链接深度优先搜索:DFS。从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点...原创 2018-09-29 11:30:53 · 373 阅读 · 0 评论 -
剑指Offer_编程题22:从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。牛客网:链接一定要弄清楚终止条件,否则很容易陷入死循环。在遍历的时候可以判断元素是否在二叉树内。# -*- coding:utf-8 -*-class TreeNode: def __init__(self, x): self.val = x self.left = None ...原创 2018-09-29 11:14:16 · 198 阅读 · 0 评论 -
剑指Offer_编程题18:二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5牛客网:链接...原创 2018-09-29 10:02:50 · 146 阅读 · 0 评论 -
剑指Offer_编程题17:树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)牛客网:链接要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和B的根结点的值一样的结点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。这里使用递归的方法即可。# -*- coding:utf-8 -*-# class TreeNode...原创 2018-09-29 09:32:35 · 144 阅读 · 0 评论 -
剑指Offer_编程题04:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。牛客网:链接通常树有如下几种遍历方式:前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。 中序遍历:先访问左子结点,再访问根结点,最后访...原创 2018-09-28 21:10:06 · 165 阅读 · 0 评论 -
剑指Offer_编程题62:二叉搜索树的第k个结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。牛客网:链接这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子结点的值 < 根结点的值 < 右子结点的值。给定一颗二叉搜索树,按照中序遍历的顺序,获得其第k大的节点。基于以上信息开始求解,会发现这几乎就是一道中序遍历的题,不同之处仅...原创 2018-10-06 16:53:18 · 156 阅读 · 0 评论 -
剑指Offer_编程题26:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。牛客网:链接根据二叉搜索树的特点:左结点的值<根结点的值<右结点的值,我们不难发现,使用二叉树的中序遍历出来的数据的数序,就是排序的顺序。因此,首先,确定了二叉搜索树的遍历方法。接下来,我们看下图,我们可以把树分成三个部分:值为10的结点、根结点为6的...原创 2018-10-06 16:51:16 · 145 阅读 · 0 评论 -
剑指Offer_编程题23:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。牛客网:链接二叉搜索树节点的值的大小,是根据中序遍历的先后顺序赋值的。中序遍历为“左中右”,在二叉搜索树中表现为:左节点的值 < 根节点的值 < 右节点的值。 根据后序遍历的性质,尾元素必定是树的根,同时小于尾元素的值是左子树,大于...原创 2018-10-06 16:19:40 · 150 阅读 · 0 评论 -
剑指Offer_编程题57:二叉树的下一个结点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。牛客网:链接上图二叉树的中序遍历是d,b,h,e,i,a,f,c,g。我们以这棵树为例来分析如何找出二叉树的下一个结点。以是否有右子树为分界点。如果一个结点有右子树,那么它的下一个结点就是它的右子树的最左子结点。也就是说从右子结点出发一直沿着指...原创 2018-10-06 11:39:25 · 210 阅读 · 0 评论 -
剑指Offer_编程题61:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树牛客网:链接序列化二叉树:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串。需要注意的是,序列化二叉树的过程中,如果遇到空节点,需要以某种符号(这里用#)表示。序列化可以基于前序/中序/后序/按层等遍历方式进行,这里采用前序遍历的方式实现,字符串之间用 “,”隔开。反序列化二叉树:根据某种遍历顺序得到的序列化字符串,重构二叉树...原创 2018-10-05 21:50:00 · 159 阅读 · 0 评论 -
剑指Offer_编程题60:把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。牛客网:链接利用列表存储二叉树每一层的节点,在读取列表中当前层节点的同时,存储下一层的节点以备用,以此类推。简单版:剑指Offer_编程题22:从上往下打印二叉树中级版:当前页高级版:剑指Offer_编程题59:按之字顺序打印二叉树# -*- coding:utf-8 -*-# class TreeN...原创 2018-10-05 20:32:13 · 155 阅读 · 0 评论 -
剑指Offer_编程题37:数字在排序数组中出现的次数(二分法)
题目:统计一个数字在排序数组中出现的次数。牛客网:链接思路:看到排序就要想到二分法。二分查找到给定的数字及其坐标。以该坐标为中点,向前向后找到这个数字的 始 – 终 位置。low <= high,low = mid + 1, high = mid - 1都必须这么写!如果出现[1,2,3,5,6]和6,不跳过mid,就会出现死循环!# -*- coding:utf-8 -*...原创 2018-07-21 09:33:24 · 255 阅读 · 0 评论 -
剑指Offer_编程题36:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。牛客网:链接LeetCode同题:LeetCode160:Intersection of Two Linked Lists共同节点,意味着从共同节点开始之后所有的节点数都是相同的,这是链表,只要有一个共同节点,那么之后所有的指向也是重复的。先依次遍历两个链表,记录两个链表的长度m和n,如果m>n,那么我们就先让长度为m的链表走m-n个...原创 2018-07-20 16:10:56 · 184 阅读 · 0 评论 -
剑指Offer_编程题34:左旋转字符串
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!牛客网:链接LeetCode同题:LeetCode189:Rotate Array剑指off...原创 2018-07-19 09:47:28 · 163 阅读 · 0 评论 -
剑指Offer_编程题40:数组中只出现一次的数字(异或)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。牛客网:链接LeetCode:single number系列空间复杂度是O(1),所以不能用字典或者列表。如果前几行代码有一个O(n)的循环,后几行代码还有一个O(n)的循环,那么时间复杂度是O(n)+O(n),其实就是O(n)。我...原创 2018-07-18 21:19:16 · 203 阅读 · 0 评论 -
剑指Offer_编程题34:第一个只出现一次的字符
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1.牛客网:链接建立一个哈希表,第一次扫描的时候,统计每个字符的出现次数。第二次扫描的时候,如果该字符出现的次数为1,则返回这个字符的位置。# -*- coding:utf-8 -*-class Solution: def Fir...原创 2018-07-18 20:19:44 · 142 阅读 · 0 评论 -
剑指Offer_编程题33:丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。牛客网:链接LeetCode:LeetCode264:Ugly Number II所谓的一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。根据丑数的定义,丑数只能被2、3和5整除。根据...原创 2018-07-18 19:04:28 · 195 阅读 · 0 评论 -
剑指Offer_编程题28:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。牛客网:链接LeetCode同题: LeetCode169:Majority Element数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字...原创 2018-07-18 11:03:21 · 278 阅读 · 0 评论 -
剑指Offer_编程题41:和为S的连续正数序列
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!牛客网:链接有序的!!!思路:设定两个...原创 2018-07-23 20:51:30 · 208 阅读 · 0 评论