
剑指Offer
Chungchinkei
这个作者很懒,什么都没留下…
展开
-
剑指Offer 65.不用加减乘除做加法(Python)
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。解题思路位运算以位运算代替四则运算,具体分为三步:第一步不考虑进位,各位相加;第二步记录下进位;第三步将前两步的结果相加.结合具体例子5+17=22:我们先从十进制的思路去分析如何做加法:第一步5和17各位相加不进位得到12(个位数5和7相加不进位是2,十位数1和0相加不进位是1);...原创 2019-08-08 13:37:55 · 397 阅读 · 0 评论 -
剑指Offer 35.复杂链表的复制 | LeetCode 138.复制带随机指针的链表(Python)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路三步法剑指Offer上的解法,具体步骤分为三步:1.复制原始链表的任意节点N并创建新节点N‘,并将N’链接到N的后面;2.第一步复制出来的节点没有rand...原创 2019-07-23 11:13:14 · 269 阅读 · 0 评论 -
剑指Offer 58.翻转字符串(Python)
目录翻转单词顺序左旋转字符串 翻转单词顺序输入一个英文橘子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。样例:输入:"I am a student."输出:"student. a am I"解题思路split / join利用内置方法可以一行写完,除了体现python的强大以外,毫无用处。class Solution: ...原创 2019-07-31 16:57:28 · 277 阅读 · 0 评论 -
剑指Offer 57.和为s的数字(Python)
和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对的数字的和等于s,则输出任意一对即可。样例:输入:数组{1,2,4,7,11,15}和数字15输出:4和11解题思路首先可以想到O(n2)O(n^2)O(n2)的做法:固定一个元素,判断剩下的n-1个和这个元素相加是否等于s. 这种解法显然忽略了递增排序这一个特点。想想更好的...原创 2019-07-31 14:18:39 · 163 阅读 · 0 评论 -
剑指Offer 53.在排序数组中查找数字(Python)
数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。样例:输入:排序数组{1,2,3,3,3,3,4,5}和数字3输出:4解题思路因为是排序数组,我们首先想到用二分查找去解决问题。核心思想就是用二分查找找到数组中的第一个k和最后一个k.二分查找剑指Offer上的做法,时间复杂度为O(logn)O(logn)O(logn).注意二分查先找到任意一个k再向两边遍历是...原创 2019-07-31 11:06:38 · 494 阅读 · 0 评论 -
剑指Offer 34.二叉树中和为某一值的路径 | LeetCode 112.路径总和(Python)
LeetCode 112.路径总和给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。解题思路LeetCode这题相对简单,只需要判断是否存在,注意路径定义为从根节点到叶节点即可。递归class Solution: def hasPathSum(self, root: TreeNode, sum: int) -> b...原创 2019-07-22 15:13:51 · 342 阅读 · 0 评论 -
剑指Offer 33.二叉搜索树的后序遍历序列(Python)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回False。假设输入的数组的任意两个数字都互不相同。解题思路在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,他们逗比根节点的值小;第二部分是右子树节点的值,他们都比根节点的值大。循环我们固然知道左子树中的节点小于根...原创 2019-07-22 14:34:24 · 298 阅读 · 2 评论 -
剑指Offer 51.数组中的逆序对(Python)
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。样例:输入:数组{7,5,6,4}输出:存在5个逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4},解题思路将数组分解成成两个长度为2的子数组,在把这两个子数组分别拆分为两个长度为1的子数组。接下来一边合并相邻的子数组,一边统计逆...原创 2019-07-31 09:11:31 · 1177 阅读 · 0 评论 -
剑指Offer 31.栈的压入、弹出序列(Python)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。示例:序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。题目解法借助一个辅助栈,模拟入栈和出栈的过程:如果下一个弹出的数字恰好是栈顶的数字,那么直...原创 2019-07-22 11:26:19 · 138 阅读 · 0 评论 -
剑指Offer 49 | LeetCode 263/264 丑数系列(Python)
LeetCode 263.丑数编写一个程序判断给定的数是否为丑数。丑数就是只包含质因数 2, 3, 5 的正整数。解题思路丑数定义为只包含质因数2,3,5的正整数,因此:如果一个数能被2整除,就连续除以2;能被3整除,就连续除以3;能被5整除,就连续除以5;最后如果得到1,则这个数是丑数。class Solution: def isUgly(self, num: int...原创 2019-07-25 16:13:03 · 221 阅读 · 0 评论 -
剑指Offer 48.最长不含重复的子字符串(Python)
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含‘a’~'z’的字符。示例:在字符串‘’arabcacfr‘’中,最长的不含重复字符的子字符串是‘’acfr‘’,长度为4.解题思路动态规划...原创 2019-08-09 17:08:12 · 340 阅读 · 0 评论 -
剑指Offer 50.第一个只出现一次的字符(Python)
题目描述字符串中第一个只出现一次的字符。示例:输入“abaccdeff”输出“b”解题思路通过构建哈希表来实现,定义哈希表的键为字符,而值为字符出现的次数。hash map第一次扫描的时间复杂度是O(n)O(n)O(n),第二次扫描读出第一个数字的时间复杂度是O(1)O(1)O(1)。创建大小为256,以字符ASCII码为键值的哈希表,空间复杂度为O(1)O(1)O(1)。...原创 2019-07-30 15:32:13 · 455 阅读 · 0 评论 -
剑指Offer 64.求1+2+...+n(Python)
题目描述求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路短路逻辑+递归当n大于0时,由于and运算符的短路逻辑,return n+self.Sum_Solution(n-1);而n = 0时,return n.class Solution: def Sum_Solution(se...原创 2019-08-08 11:10:21 · 210 阅读 · 0 评论 -
剑指Offer 63.股票的最大利润 | LeetCode 121/122/123 买卖股票的最佳时机(Python)
目录剑指Offer 63.股票的最大利润LeetCode 121.买卖股票的最佳时机ILeetCode 122.买卖股票的最佳时机IILeetCode 123.买卖股票的最佳时机III剑指Offer 63.股票的最大利润 | LeetCode 121.买卖股票的最佳时机I假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖一次该股票可能获得的利润是多少?样例:输入:[9, ...原创 2019-08-01 15:57:37 · 182 阅读 · 0 评论 -
剑指Offer 62.圆圈中最后剩下的数字(Python)
题目描述0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。样例:输入:n=5 , m=3输出:3解题思路题目是经典的约瑟夫(Josephuse)环问题。模拟圆圈用一个数组去模拟圆圈,然后每次在数组中删除第m个元素。时间复杂度为O(n)O(n)O(n),空间复杂度为O(n)O(n)O...原创 2019-08-01 15:19:13 · 547 阅读 · 0 评论 -
剑指Offer 61.扑克牌中的顺子(Python)
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。样例1:输入:[8,9,10,11,12]输出:true样例2:输入:[0,8,9,11,12]输出:true解题思路要为顺子必须满足以下几个条件:...原创 2019-08-01 15:18:12 · 475 阅读 · 0 评论 -
剑指Offer 60.n个骰子的点数(Python)
题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的概率。解题思路其本质是求数列f(n)=f(n−1)+f(n−2)f(n−3)+f(n−4)+f(n−5)+f(n−6)f(n) = f(n-1) +f(n-2) f(n-3)+ f(n-4) +f(n-5)+ f(n-6)f(n)=f(n−1)+f(n−2)f(n−3)+f(n−4)+f(n−5)+...原创 2019-08-01 15:15:26 · 939 阅读 · 2 评论 -
剑指Offer 42.连续子数组的最大和 | LeetCode 53.最大子序和(Python)
剑指Offer 42.连续子数组的最大和输入一个整型数组,数组里有整数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的个的最大值。示例:输入的数组为{1,-2,3,10,-4,7,2,-5},其最大子数组{3,10,-4,7,2},输入为该子数组的和18。LeetCode 53.最大子序和两题表述不一样,实际上是同一个题。解题思路动态规划如果用函数f(i...原创 2019-07-23 15:20:02 · 210 阅读 · 0 评论 -
剑指Offer 59.队列的最大值(Python)
滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。样例:输入:数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3输入:一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}解题思路蛮力法扫描每个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口为k,则需要O(k)O(k)O(k)时间才能找出滑动窗口里的最大值。对于长度为n的输入数组,这...原创 2019-08-01 10:26:34 · 772 阅读 · 0 评论 -
剑指Offer 40.最小的k个数(Python)
题目描述输入n个整数,找出其中最小的k个数。示例:输如4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。解题思路排序直接将n个整数排序,返回前k个数。时间复杂度是O(nlogn)O(nlogn)O(nlogn)。class Solution: def GetLeastNumbers_Solution(self, tinput, k): ...原创 2019-07-23 14:20:53 · 116 阅读 · 0 评论 -
剑指Offer 39.数组中超过一半的数字 | LeetCode 169.求众数(Python)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。示例:输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路摩尔投票法注意这题有诈,题目要求数字出现次数超过数组长度的一半,并不是直接返回众数。class Solution: def MoreThanHa...原创 2019-07-23 11:44:03 · 165 阅读 · 0 评论 -
剑指Offer 38 | LeetCode 46/47 全排列系列(Python)
目录LeetCode 46.全排列剑指Offer 38.字符串的全排列LeetCode 46.全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]解题思路求全排列,可以看成两步:第一步求可能出...原创 2019-07-24 16:36:14 · 196 阅读 · 0 评论 -
剑指Offer 47.礼物的最大价值(Python)
剑指Offer 47.礼物的最大价值(Python)原创 2019-07-25 14:22:21 · 422 阅读 · 0 评论 -
剑指Offer 25 | LeetCode 21 合并两个排序的链表(Python)
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目解法递归思路主要是比较两个节点的大小。举具体例子进行说明:链表1: 1,3,5,7链表2: 2,4,6,8第一步比较节点1和节点2的大小关系,可以确定合并后的链表第一个节点为1;第二步比较节点1的原下一个节点3和节点2的大小关系,确定新链表的第二个节点为2;...如此类推...原创 2019-07-17 16:24:52 · 148 阅读 · 0 评论 -
剑指Offer 27.二叉树的镜像 | LeetCode 226.翻转二叉树(Python)
题目描述请完成一个函数,输入一颗二叉树,该函数输出它的镜像。翻转二叉树后便得到二叉树的镜像。递归class Solution(object): def invertTree(self, root): """ :type root: TreeNode :rtype: TreeNode """ if no...原创 2019-07-18 09:17:57 · 239 阅读 · 0 评论 -
剑指Offer 6.从尾到头打印链表(Python)
题目介绍输入一个链表,从尾到头反过来打印出每个节点的值。链表节点定义如下:# class ListNode:# def __init__(self, x):# self.val = x# self.next = None算法解析递归class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] de...原创 2019-07-11 11:07:37 · 229 阅读 · 0 评论 -
剑指Offer 4.二维数组中的查找(Python)
题目介绍在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例: 在下图矩阵中,查找数字7。1 2 8 92 4 9 124 7 10 136 8 11 15题目解读矩阵每行从左到右递增,每列也从上到下递增,因...原创 2019-07-11 09:38:41 · 179 阅读 · 0 评论 -
剑指Offer 3 | Leetcode 442 数组中重复的数字系列(Python)
1.找出数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。示例输出长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或3题目解读提取题目中的关键信息:长度为n的数组,数字范围在0到n-1内,也就是数字的取值范围不会大于ind...原创 2019-07-10 16:23:27 · 303 阅读 · 0 评论 -
剑指Offer 19.正则表达式匹配(Python)
题目介绍请实现一个函数用来匹配包括 . 和 * 的正则表达式。模式中的字符 . 表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。字符串"aaa"与模式"a.a"和"ab*ac*a"匹配;字符串"aaa"与"aa.a"和"ab*a"均不匹配。题目解读我们可以先从 * 字符进行入手,因为 * 字符相对于 . 字符来说...原创 2019-06-03 17:46:02 · 450 阅读 · 0 评论 -
剑指Offer 52.两个链表的第一个公共节点 | LeetCode 160.相交链表(Python)
LeetCode 160.相交链表(Python实现)题目要求很简单,找到两个单链表相交的起始节点。如下面图所示:链表A、链表B在节点c1处相交,节点c1即为题目所求。注意:如果两个链表没有交点,返回null;在返回结构后,两个链表仍须保持原有的结构;可假定整个链表结构中没有循环;程序尽量满足O(n)时间复杂度,且仅用O(1)内存.题目解读:要注意程序的鲁棒性,特别是在...原创 2019-03-31 20:48:01 · 446 阅读 · 0 评论 -
剑指Offer 26.树的子结构 | LeetCode 572.另一个树的子树(Python)
题目介绍1.另一个树的子树给定两个非空二叉树s和t,检验s中是否包含和t具有相同结构和节点值的字数。s的一个子树包括s的一个节点和这个节点的所有子孙。s也可以看做它自身的一颗子树。实例1:给定的树s: 3 / \ 4 5 / \ 1 2 给定的树t: 4 / \ 1 2返回true,因为t与s的一...原创 2019-04-29 18:15:30 · 601 阅读 · 0 评论 -
剑指Offer 32 | LeetCode 102/103/107 二叉树的层次遍历系列(Python)
题目介绍LeetCode 102题目给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [3], [9,20], [15,7]]而在LeetCode 107中则要...原创 2019-04-06 21:40:46 · 249 阅读 · 0 评论 -
剑指Offer 43.1~n整数中1出现的次数 | LeetCode 233.数字1的个数 (Python)
题目介绍给定一个整数n,计算所有小于等于n的非负整数中数字1出现的个数。输入: 13输出: 3解释: 数字1出现在以下数字中:1,10,11,12,13原创 2019-04-26 21:28:00 · 1043 阅读 · 0 评论 -
剑指Offer 28 | LeetCode 对称二叉树(Python)
题目描述给定一个二叉树,检查它是否是镜像对称的。题目解法思路是判断左子树与右子树的翻转是不是同一棵树。基于LeetCode 100.相同的树,巧妙地进行判断。class Solution(object): def isSameTree(self, p, q): if not p and not q: return True if p and q ...原创 2019-07-18 09:54:47 · 114 阅读 · 0 评论 -
剑指Offer 14.剪绳子(Python)
题目描述给你一根长度为你的绳子,请把绳子剪成m段(m、n都是整数),n > 1 且 m > 1),每段绳子的长度记为k[0], k[1],…,k[m]。请问k[0] x k[1] x … x k[m]可能的最大乘积是多少?示例:当绳子长度是8时,我们把它剪成长度为2、3、3的三段,此时得到的最大乘积是18。动态规划寻找规律f(n)=max(f(i)∗f(n−i))f(n)...原创 2019-07-16 09:42:44 · 373 阅读 · 0 评论 -
剑指Offer 15.二进制中1的个数(Python)
题目描述请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。示例:把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出2。算法解析Python3不像c/c++,其int型在理论上没有位数限制,而实际上是由机器的内存决定的。二进制负数前面会有无限个1,所以通过按位与0xffffffff将位数限制在32位以内。再用一种巧妙的方法去统计1的个数:n = (n-...原创 2019-07-16 11:16:54 · 286 阅读 · 0 评论 -
剑指Offer 24 | LeetCode 206 反转链表(Python)
题目描述输入一个链表,反转链表后,输出新链表的表头。题目解法递归参考我之前在知乎发的图解文章:https://zhuanlan.zhihu.com/p/60117407主要思路是递归到最后的节点,然后进行操作。class Solution: # 返回ListNode def ReverseList(self, pHead): # write code ...原创 2019-07-17 16:02:54 · 200 阅读 · 0 评论 -
剑指Offer 46.把数字翻译成字符串(Python)
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。原创 2019-08-12 08:21:47 · 806 阅读 · 0 评论 -
剑指Offer 44.数字序列中某一位的数字 | LeetCode 400.第N个数字(Python)
剑指Offer 44.数字序列中某一位的数字数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。LeetCode 400.第N个数字在无限的整数序列1,2,3,4,5,6,7,8,9,10,11,…中找到第n个数字。解题思路举一个具体的例子来...原创 2019-07-24 14:51:33 · 460 阅读 · 0 评论 -
剑指Offer 23.链表中环的入口节点 | LeetCode 142.环形链表II (Python)
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。题目解法双指针思路:第一步确定链表中是否包含环,可用一个快指针,一个慢指针。快指针走两步,慢指针走一步,如果快指针能追上慢指针,说明链表有环。第二步是如何找到环的入口,可以再初始化一个慢指针,新的慢指针从头开始遍历,旧的慢指针从快慢指针相交的节点开始遍历,两个慢指针再次相遇时即为入口节点。PS:剑...原创 2019-07-17 15:41:15 · 309 阅读 · 0 评论