
牛客
文章平均质量分 64
牛客剑指offer篇
NLP_victor
这个作者很懒,什么都没留下…
展开
-
剑指Offer13. 机器人的运动范围DFS(Python)
一、题目描述https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38]原创 2020-08-27 15:59:52 · 257 阅读 · 0 评论 -
二分、快速幂-16:数值的整数次方(剑指offer第2版)50. Pow(x, n)
1、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2、代码详解先说结论:特例:底数为0且指数为负,抛异常“0不能求倒数” equal_zero时,因为计算机内表示小数有误差,要写成abs(num - 0.0) < 0.0000001 1.0/base,不能写成1/base 位运算优化效率“整除以2...原创 2020-03-08 19:24:52 · 221 阅读 · 1 评论 -
44:数字序列中某一位的数字(剑指offer第2版Python)LeetCode.400
1、题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:输入:n = 3 输出:3示例 2:输入:n = 11 输出:0 限制:0 <= n <2^312、代码详解...原创 2020-03-08 17:16:13 · 397 阅读 · 0 评论 -
21:调整数组顺序使奇数位位于偶数位前面(剑指offer第2版Python)
1、题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2、书上的解法(相对位置改变)一个类似于快排的方法, 只是简单的满足了奇数在前,偶数在后, 奇数的顺序发生了改变# -*- coding:utf-8 -*-class Solution: d...原创 2020-03-08 16:47:10 · 330 阅读 · 0 评论 -
3:数组中重复的数字(剑指offer第2版Python)
1、题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。2、代码详解对于一个长度为n的数组里所有的数字都在0到n-1的范围内。查找重复数字的话,首先容易想到...原创 2020-03-08 00:00:05 · 270 阅读 · 0 评论 -
4:二维数组中的查找(剑指offer第2版)LeetCode240:搜索二维矩阵II
1、题目详解在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。同LeetCode240:搜索二维矩阵IIhttps://leetcode-cn.com/problems/search-a-2d-matrix-ii/solution/er-fe...原创 2020-03-03 21:44:07 · 318 阅读 · 0 评论 -
68-1:二叉搜索树的最近公共祖先(剑指offer第2版Python)LeetCode.235
1、题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入...原创 2020-03-02 23:11:35 · 300 阅读 · 0 评论 -
LeetCode297. 二叉树的序列化与反序列化+37:序列化二叉树(剑指offer第2版)
一、题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种...原创 2020-03-01 22:05:11 · 346 阅读 · 0 评论 -
8:二叉树的下一个结点(剑指offer第2版Python)
1、题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2、代码详解三种情况:当前节点有右子树的话,当前节点的下一个结点是右子树中的最左子节点; 当前节点无右子树但是是父节点的左子节点,下一个节点是当前结点的父节点; 当前节点无右子树而且是父节点的右子节点,则一直向上遍历,直到找到...原创 2020-03-01 21:08:33 · 235 阅读 · 0 评论 -
26:树的子结构(剑指offer第2版Python)
1、题目描述2、代码详解# -*- coding:utf-8 -*-class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None# 递归终止条件:达到了树A或者树B的叶节点,即遍历完某树cla...原创 2020-03-01 19:59:18 · 331 阅读 · 0 评论 -
LeetCode105. 从前序与中序遍历序列构造二叉树+剑7:重建二叉树
1、题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2、代码详解利用二叉树前序遍历和中序遍历的特性。前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点...原创 2020-02-29 21:43:03 · 299 阅读 · 0 评论 -
23:链表中的环的入口结点(剑指offer第2版Python)
1、题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2、代码详解寻找链表中环的入口结点主要分成三个步骤:首先是设置两个快慢指针,如果快慢指针相遇,则快慢指针必然都在环中;然后从相遇的地方设置一个指针向后遍历并记录走的步数,当这个指针重新指到开始的位置的时候,当前对应的步数就是环中结点的数量k;然后设置两个指针从链表开始,第一个节点先走...原创 2020-02-29 21:24:53 · 303 阅读 · 0 评论 -
9:用两个栈实现队列(剑指offer第2版Python)
一、用两个栈实现队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。# -*- coding:utf-8 -*-'''两个栈实现队列:一个栈负责入队,另一个负责出队'''class Solution: def __init__(self): self.stack1 = [] # 负责入队 self....原创 2020-02-26 23:18:57 · 202 阅读 · 0 评论 -
22:链表中倒数第k个节点(剑指offer第2版)+ LeetCode19. 删除链表的倒数第N个节点
1、题目描述输入一个链表,输出该链表中倒数第k个结点。注意代码鲁棒性,三种特殊情况要考虑到如果在只希望一次遍历的情况下, 寻找倒数第k个结点, 可以设置两个指针第一个指针先往前走k-1步, 然后从第k步开始第二个指针指向头结点然后两个指针一起遍历当地一个指针指向尾节点的时候, 第二个指针正好指向倒数第k个结点推广: 寻找中间节点, 两个指针一起, 第一个指针每次走两步, 第...原创 2020-02-24 23:20:34 · 242 阅读 · 0 评论 -
18:删除链表中重复的结点(剑指offer第2版Python)
1、题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->52、代码详解# -*- coding:utf-8 -*-class ListNode: def __init__(self, x): ...原创 2020-02-24 12:36:37 · 204 阅读 · 0 评论 -
53-1:数字在排序数组中出现的次数(剑指offer第2版Python)
1、题目描述2、代码详解二分查找的扩展。可以构造两个函数。第一个函数查找目标数字出现的最前面的位置,先使用二分查找找到该数字,如果该数字的index > 0而且该数字前面一个数字等于k的话,那么就令end=middle-1,继续二分查找。对于第二个函数,查找目标数字出现的最后面的位置,反之编写。最后如果数字存在的话,令走后面的index减去最前面的index然后+1即可。...原创 2020-02-21 12:23:52 · 276 阅读 · 0 评论 -
剑11LC153.154 寻找旋转数组中的最小值+33. 81搜索旋转排序数组(旋转数组系列)
1、题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2、代码详解# -*- coding:utf-8 -*-class Solution: ...原创 2020-02-17 19:15:35 · 367 阅读 · 0 评论 -
51:数组中的逆序对(剑指offer第2版Python)
1、题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数...原创 2020-02-17 18:53:37 · 256 阅读 · 0 评论 -
41:数据流中的中位数(剑指offer第2版Python)
1、题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。2、代码详解# -*- coding:utf-8 -*-from heapq i...原创 2020-01-11 21:08:46 · 513 阅读 · 0 评论 -
67:把字符串转换成整数(剑指offer第2版Python)
1、题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例(牛客要求不能整数溢出!!!)输入+2147483647 1a33输出2147483647 02、代...原创 2020-01-11 18:38:00 · 451 阅读 · 0 评论 -
59-1:滑动窗口的最大值(剑指offer第2版Python)
1、题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2020-01-10 19:35:24 · 303 阅读 · 0 评论 -
57-2:和为S的连续正数序列(剑指offer第2版Python)
1、题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正...原创 2020-01-08 19:40:25 · 272 阅读 · 0 评论 -
57-1:和为S的两个数字(剑指offer第2版Python)
1、题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。2、代码详解设定两个指针,一个指向数组的起点,一个指向数组的终点,然后对两个数字求和,如果和大于目标值,则把后一个指针前移,如果和小于目标值,则把前一个指针后移。两个指针交汇的时候如果还没找到...原创 2020-01-08 19:11:29 · 225 阅读 · 0 评论 -
39:数组中出现次数超过一半的数字(剑指offer第2版Python)
1、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2、代码详解第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后...原创 2019-06-12 18:44:00 · 193 阅读 · 0 评论 -
38:字符串的排列(剑指offer第2版Python)
一、题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。二、代码详解依次取一个元素,然后依次和之前递归形成的所有子串组合,形成新的字符串。# -*- c...原创 2019-06-03 21:04:46 · 334 阅读 · 0 评论 -
33:二叉搜索树的后序遍历序列(剑指offer第2版Python)
1、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2、代码详解根据后续遍历的性质,尾元素必定是树的根,同时小于尾元素的值是左子树,大于尾元素的值为右子树,且序列前半部分均小于尾元素,后半部分均大于尾元素(如果同时存在左右子树的话),可以将序列划分左子树序列和右子树序列,然后递归比较是否每...原创 2019-06-01 11:57:30 · 341 阅读 · 0 评论 -
BFS-32:从上到下打印二叉树(剑指offer2)102. 二叉树的层序遍历
1、题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。2、代码详解相当于按层遍历, 中间需要队列做转存,引入一个队列即可。推广:有向图的广度优先遍历也是基于队列的。# -*- coding:utf-8 -*-class TreeNode: def __init__(self, x): self.val = x sel...原创 2019-05-31 16:25:19 · 262 阅读 · 0 评论 -
31:栈的压入、弹出序列(剑指offer第2版Python)
1、题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2、代码详解建立一个辅助栈,把push序列的数字依次压入...原创 2019-05-30 22:29:31 · 251 阅读 · 0 评论 -
52:两个链表的第一个公共结点(剑指offer第2版Python)
1、题目描述输入两个链表,找出它们的第一个公共结点。2、代码详解首先依次遍历两个链表,记录两个链表的长度m和n。如果 m > n,那么我们就先让长度为m的链表走m-n个结点,然后两个链表同时遍历,当遍历到相同的结点的时候停止即可。对于 m < n,同理。# -*- coding:utf-8 -*-class ListNode: def __init_...原创 2019-12-28 20:26:54 · 239 阅读 · 0 评论 -
50:第一个只出现一次的字符(剑指offer第2版Python)
1、题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).2、代码详解哈希表先遍历一遍字符串,用一个hash表存放每个出现的字符和字符出现的次数。再遍历一遍字符串,找到hash值等于1的输出即可。# -*- coding:utf-8 -*-class So...原创 2019-12-26 21:49:33 · 147 阅读 · 0 评论 -
42:连续子数组的最大和(剑指offer第2版Python)
1、题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大...原创 2019-12-24 21:25:02 · 283 阅读 · 0 评论 -
40:最小的K个数(剑指offer第2版Python)
1、题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。2、代码详解2.1 基于划分的方法如果是查找第k个数字,第一次划分之后,划分的位置如果大于k,那么就在前面的子数组中进行继续划分,反之则在后面的子数组继续划分,时间复杂度O(n)2.2 适用于海量数据的方法该方法基于二叉树或者堆来实现,首先把数...原创 2019-12-23 19:14:24 · 206 阅读 · 0 评论 -
39:数组中出现次数超过一半的数字(剑指offer第2版Python)
1、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2、代码详解书上第二种思路:根据数组的特点,出现次数超过一半的数,他出现的次数比其他数字出现的总和还要多。因此可以最开始保存两个数值:数组中的一个数字以及它出...原创 2019-12-21 21:47:32 · 242 阅读 · 0 评论 -
20:表示数值的字符串(剑指offer第2版Python)
1、题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。2、代码详解# -*- coding:utf-8 -*-class Solution: # s字符串 def...原创 2019-11-16 16:26:01 · 254 阅读 · 0 评论 -
19:正则表达式匹配(剑指offer第2版Python)
1、题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配2、思路分析当模式中的第二个字符不是“*”时:如果字符串第一个字符和...原创 2019-11-16 11:41:39 · 268 阅读 · 0 评论 -
29:顺时针打印矩阵(剑指offer第2版Python)
1、题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:[[ 1, 2,...原创 2019-05-29 19:24:10 · 259 阅读 · 0 评论 -
15:二进制中1的个数(剑指offer第2版Python)
11、旋转数组中最小的数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。# -*- coding:utf-8 -*-class Solution: ...原创 2019-05-26 18:02:15 · 185 阅读 · 0 评论 -
力扣.206剑24.反转链表+92.反转从位置m到n的链表
21、调整数组顺序使奇数位位于偶数位前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。书上的解法:一个类似于快排的方法, 只是简单的满足了奇数在前,偶数在后, 奇数的顺序发生了改变# -*- coding:utf-8 -*-class Solution:...原创 2019-05-27 16:22:16 · 365 阅读 · 0 评论 -
30:包含min函数的栈(剑指offer第2版Python)
1、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。2、代码详解引入两个栈,一个栈(数据栈)每次push实际的数字,另一个minStack(辅助栈)。如果push的数字小于minStack栈顶的数字,push新的数字,反之,把栈顶的数字再压入一遍。代码如下:# -*- coding:utf-8 -*-c...原创 2019-05-30 21:07:30 · 145 阅读 · 0 评论 -
10:斐波那切数列(剑指offer第2版Python)
7、重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x...原创 2019-05-23 22:18:12 · 213 阅读 · 0 评论