自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

热辣芒果园

Python学习

  • 博客(69)
  • 收藏
  • 关注

原创 计划2019

剑指Offer2019.2.21为止,《剑指Offer》正文题目(66/66)已经都用Python实现了。博客中记录思路与代码。代码github:https://github.com/Run0812/Algorithm-Learning/tree/master/to_offerLeetCode在做《剑指Offer》的同时,也覆盖了一些LeetCode,目前已做了94题。下一步,不打算再...

2019-02-21 14:50:56 178

原创 [Python源码剖析] #0 准备工作

准备工作下载python-cobra 作者提供的可视化Python虚拟机Small Python 作者提供的对Python的简化模拟pyc_parser 作者提供的pyc文件解析器python2.5.0 该书使用的Python源码PS: 这些资源是从网上搜集到,本人对其内容不负任何责任编译配置原书使用VS2003,本人使用VS2019使用PCBuild8下面的文件修改解决方案的默认启动工程为Python编译工程选择Debug,只勾选Python, Pythoncore仅重新编译

2020-11-22 22:54:51 101

原创 [剑指Offer] 66_构建乘积数组

题目给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路B中每个元素都由A中元素累乘得到。时间复杂度:O(n^2)空间复杂度:O(1)由于不能使用除法,所以每个元素必须靠相乘得到,那么如果利用之前计算的结果,就必须使前面计算...

2019-02-21 14:41:43 114

原创 [剑指Offer] 65_不用加减乘除做加法

题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。思路思路很简单,学过数字电路的都明白…bit_a+bit_b生成一个bit_sum和ci(进位)。这题就是要模拟二进制加法,ci = a & b,sum = a ^ b。因为,1+0=0+1=1,0+0=1+1=0,只考虑这一位的话加法和异或是一样的,进位就考察是否a=b=1即可,即a & ...

2019-02-21 14:28:01 121

原创 [剑指Offer] 64_求1+2+…+n

题目求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路首先不能使用循环,因此只能采取递归的方式。但是不能用判断语句,所以要找到一个递归出口。我一开始没想到,后来看到别人用了2种方法:1、短路求值 2、用字典实现switch。书上都是C++的方法。时间复杂度:O(n)空间复杂度:O(n)...

2019-02-21 14:12:09 116

原创 [剑指Offer] 63_股票的最大利润

题目假设把把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例:一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路遍历考察所有买卖情况,选择最大利润。时间复杂度:O(n^2)空间复杂度:O(1)动态规划。类似连续子数...

2019-02-21 14:03:58 188

原创 [剑指Offer] 62_圆圈中最后剩下的数字

题目0, 1,…, n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈剩下的最后一个数字。思路模拟转圈的过程,计数并弹出数字,最后剩下一个数的时候就输出。时间复杂度:O(n^2)空间复杂度:O(n)通过数学解得递推公式,从n=0,逐步求得n=n。时间复杂度:O(n)空间复杂度:O(1)代码思路1:时间复杂度:O(n^2)...

2019-02-21 13:39:22 119

原创 [剑指Offer] 61_扑克牌中的顺子

题目从扑克牌中随机抽5张牌,判断是不是一个顺子,即5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。思路只要判断5个数字是否连续。将数组排序后,除掉大小王,判断是否间隔为1,若不为1,是否有足够的大小王数量来填补。时间复杂度:O(n)空间复杂度:O(1)代码思路: 时间复杂度:O(n),空间复杂度:O(1)de...

2019-02-21 12:06:39 79

原创 [剑指Offer] 60_n个骰子的点数

题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路动态规划,考虑已经求得F(n-1)时,F(n)即在其基础上再考虑多一个骰子=1~6的结果。当有n个骰子,和为i时,出现的次数F(n,i)=∑k=16F(n−1,i−k)F(n, i) = \sum_{k=1}^6 F(n-1, i -k)F(n,i)=∑k=16​F(n−1,i−k)。...

2019-02-21 11:18:16 255

原创 [剑指Offer] 59_队列的最大值

题目1:滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例:输入:[2, 3, 4, 2, 6, 2, 5, 1], 滑动窗口大小3输出:[4, 4, 6, 6, 6, 5]思路遍历数组,每次计算滑动窗口中的最大值。时间复杂度:O(mn)空间复杂度:O(1)遍历数组,按顺序保存当前位置窗口内的最大值,以及候选最大值。当新值进入时,从后向前...

2019-02-20 17:09:59 611

原创 [剑指Offer] 58_翻转字符串

题目1:反转单词顺序输入一个英文句子,翻转句子中的单词顺序,但单词内字符顺序不变。为简单器件,标点符号和普通字母一样处理。例:输入:“I am a student.”输出:“student. a am I”思路利用python字符串的内置方法,以空格划分字符串成列表。然后翻转即可。时间复杂度:O(n)空间复杂度:O(n)两次翻转,第一次全字符串翻转,第二次对每个单词...

2019-02-20 16:54:25 169

原创 [剑指Offer] 57_和为s的数字

题目1:和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。例:输入:[1, 2, 4, 7, 11, 15]输出:4, 11思路遍历数组,当前位置后查找s-num[i]是否存在。时间复杂度:O(n^2)空间复杂度:O(1)遍历数组,将数字存入一个哈希表。再遍历数组,在哈希表中...

2019-02-20 16:40:23 131

原创 [剑指Offer] 56_数组中数字出现的次数

题目1:数组中只出现一次的两个数字一个整型数组中除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。例:输入:[2, 4, 3, 6, 3, 2, 5, 5]输出:4, 6思路利用异或运算的特点,a^a = 0;0^a = a。第一次遍历异或的结果为s = n1 ^ n2。此时s的二级制位表征了n1和n2各位...

2019-02-20 16:13:51 124

原创 [剑指Offer] 55_二叉树的深度

题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点形成树的一条路径,从最长路径的长度为树的深度。例: 1 / \ 2 3 / \ \ 4 5 6 / 7深度为4。思路深度优先遍历,返回当前子树深度。H(root) = max(H(root.left), H(r...

2019-02-20 15:15:43 114

原创 [剑指Offer] 54_二叉搜索树的第K大节点

题目给定一棵二叉搜索树,请找出其中第k大的节点。例:如下图的二叉搜索树,按节点数值大小顺序,第三大节点是4。 5 / \ 3 7 / \ / \ 2 4 6 8思路题目表述有误,按照其例子应为第K小节点。因为是二叉搜索树,因此节点大小是有规律的,以LDR中序序遍历的第K个节点就是第K小节点。时间复杂度:O(n)...

2019-02-20 14:59:15 198

原创 [剑指Offer] 53_在排序数组中查找数字

题目1:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。例:输入数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3。由于3在这个数组中出现了4次,输出4。思路遍历数组统计。时间复杂度:O(n)空间复杂度:O(1)遍历统计没有利用到这是个排序数组的信息。因为是排序数组,所以需要统计的数字i个数等于i_right - i_left + 1。只要找到...

2019-02-20 14:23:11 118

原创 [剑指Offer] 52_两个链表的第一个公共节点

题目输入两个链表,找出它们的第一个公共节点。例:1->2->3 \ >6->7 / 4->5公共节点为6。思路遍历链表A,将每个节点存入一个哈希表。再遍历链表B,继续向哈希表内存储,当出现冲突时,即找到了第一个公共节点。时间复杂度:O(m+n)空间复杂度:O(m+n)遍历链表...

2019-02-20 14:03:30 107

原创 [剑指Offer] 51_数组中的逆序对

题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例:在数组中{7, 5, 6, 4}中,一共存在5个逆序对,分别是(7, 6)、(7, 5)、(7, 4)、(6, 4)、(5, 4)思路顺序扫描整个数组,向后比较是否存在逆序对。时间复杂度:O(n^2)空间复杂度:O(1)分析逆序对多少就是...

2019-02-20 13:16:26 137

原创 [剑指Offer] 50_第一个只出现一次的字符

题目1:字符串中第一个只出现一次的字符在字符串中找到第一个只出现一次的字符。例:输入"abaccdeff",则输出’b’。思路遍历字符串,每个字母第一次出现时将字母作为key,index作为val存入字典,当在字典中有key时,则将val改写为-1,表示出现2次以上。遍历字符串结束后,遍历字典,输出位置最小的字符。时间复杂度:O(n)空间复杂度:O(1)代码de...

2019-02-19 21:11:01 115

原创 [剑指Offer] 49_丑数

题目我们把只包含因子2、3和5的数称为丑数。求按从小到大的顺序的第1500个丑数。例:6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数。思路遍历数字,对每个数字判断是否只包含2、3、5因子。问题在于,有很多无用的计算,增加时间复杂度。时间复杂度:>O(n)空间复杂度:O(1)可以发现一个规律,丑数只包含2、3、5的因子,因此丑数 = ...

2019-02-19 20:51:40 89

原创 [剑指Offer] 48_最长不包含重复字符的子字符串

题目请从字符串中找到一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设该字符串只包含’a’~'z’的字符。例:在字符串’arabcacfr’中,最长的不包含重复字符的子字符串是"acfr",长度为4。思路遍历字符串,计算以每个字符为结尾的不含重复字符的子字符串的长度,更新最长长度。问题的关键在于,如何能最快的判断是否存在重复字符。如果每次都向前逐个比较,总复杂度...

2019-02-19 20:00:33 118

原创 [剑指Offer] 47_礼物的最大价值

题目在一个m x n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物。例:1 10 3 812 2 9 65 7 4 113 7 16 5最大价值53,1->12-&gt...

2019-02-19 17:47:32 109

原创 [剑指Offer] 46_把数字翻译成字符串

题目给定一个数字,我们按照如下规则把它翻译位字符串:0 = ‘a’; 1 = ‘b’;…; 25 = ‘z’,一个数字可能有多种翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。例:12258,有5种翻译:“bccfi”, “bwfi”, “bczi”, “mcfi”, “mzi”。思路按书上理解,每一位数字有2种可能,单独翻译和与后一位合并翻译,因此f(i) =...

2019-02-19 17:10:19 317

原创 [剑指Offer] 45_把数组排成最小的数

题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例:输入数组{3, 32, 321}, 打印321323。思路排列出所有的组合,比较出最小的,输出。时间复杂度:O(n!)空间复杂度:O(n!)考察最小组合的形式,遵从下面的规律:1、首位小的靠前 2、首位相同,次位小的靠前 3、位数少的靠前。因此等价于比较a + b 和 ...

2019-02-19 15:58:35 164

原创 [剑指Offer] 44_数字序列中某一位的数字

题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。n = 5,输出5;n = 13,输出1; n = 19, 输出4。思路最直接的思路:顺序枚举数字,计数直到输出。时间复杂度:O(n)空间复杂度:O(1)分段处理,0~9有...

2019-02-19 14:10:19 85

原创 [剑指Offer] 43_1~n整数中1出现的次数

题目输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例:输入12,1 ~ 12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。思路遍历1~n,每个数字转换成字符串计数1的个数。时间复杂度:O(nlogn)空间复杂度:O(1)将1~n分段,分别处理。num=n1n2....ninum = n_1n_2....n_inum=n1​n2​......

2019-01-25 15:25:15 100

原创 [剑指Offer] 42_连续子数组的最大和

题目输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度:O(n)例:输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18, [3, 10, -4, 7, 2]思路遍历比较所有可能的子序和。时间复杂度:O(n^2)空间复杂度:O(1)T(n+1) = max(T(n)+N[...

2019-01-24 15:05:48 89

原创 [剑指Offer] 41_数据流中的中位数

题目如何得到一个数据流中的中位数?如果数据流中读出奇数个值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序后中间两个数的平均值。思路关键在于选择合适的数据结构,使得求中位数和插入元素的时间复杂度尽可能小。乱序数组:新数据插入数组后方,求中位数时排序。排序数组:排序插入数组,中位数返回中间值。二叉搜索树:添加属性表示子树的节...

2019-01-21 10:46:58 128

原创 [剑指Offer] 40_最小的k个数

题目输入n个整数,找出其中的最小的k个数。例:输入[4, 5, 1, 6, 2, 7, 3, 8] K = 4输出[1, 2, 3, 4]思路排序输出前K个数。时间复杂度:O(nlogn)空间复杂度:O(n)使用partition,递归找到第k个位置的数,输出其左边的序列。时间复杂度:O(n)空间复杂度:O(n),不修改原数组;O(1),修改原数组使用一...

2019-01-17 21:19:28 112

原创 [剑指Offer] 39_数组中出现次数超过一半的数字

题目数组种有一个数字出现的次数超过数组长度的一半,请找出这个数字。例:输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路排序后输出第n/2个数字,即为答案时间复杂度:O(nlgon)空间复杂度:O(1)用快排的划分函数寻找第n/2大的数。基本思路是先选一个数作为划分标准,小于放在左边,大于...

2019-01-17 14:52:52 81

原创 [剑指Offer] 38_字符串的排列

题目输入一个字符串,打印出该字符串中字符的所有排列。例:输入:‘abc’输出:‘abc’, ‘acb’, ‘bac’, ‘cab’, ‘cba’思路长度为n的字符串的排列若是集合S,其中一种排列的字符串为<s1,s2,...,sn><s_1,s_2,...,s_n><s1​,s2​,...,sn​>,再插入sn...

2019-01-17 11:41:38 86

原创 [剑指Offer] 37_序列化二叉树

题目请实现两个函数,分别用来序列化和反序列化二叉树例:树: 1 / \ 2 3 / / \ 4 5 6序列化:[1, 2, 4, $, $, $, 3, 5, $, $, 6, $, $]思路容易发现序列化其实就是带None的前序遍历。所以题目就是完成一个前序遍历将节点值存入列表,遍历列表按前序生成一棵...

2019-01-16 15:54:09 73

原创 [剑指Offer] 36_二叉搜索树与双向链表

题目输入一棵二叉树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树种节点指针的指向。例:输入: 10 / \ 6 14 / \ / \ 4 8 12 16输出:4<->6<->8<->10<->...

2019-01-15 18:19:50 87

原创 [剑指Offer] 35_复杂链表的复制

题目请实现啊函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中除了有一个m_pNext指针指向下一个节点,还有一个m_pSaibling指针指向链表中的任意节点或者nullptr。节点定义如下:class ComplexListNode(object): def __init__(self, x):...

2019-01-15 14:20:23 85

原创 [剑指Offer] 34_二叉树中和为某一值的路径

题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \...

2019-01-14 14:22:56 69

原创 [剑指Offer] 33_二叉搜索树的后序遍历序列

题目输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历结果,如果是则返回True,否则返回False。假设输入的数组的任意两个数字都互不相同。例:输入数组[5, 7, 6, 9, 11, 10, 8], 则返回True。因为这个整数序列是下树的后序遍历。 8 / \ 6 10 / \ / \ 5 ...

2019-01-13 17:26:52 141

原创 [剑指Offer] 32_从上到下打印二叉树

题目1. 不分行从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点,按照从左到右的顺序打印。例:输入: 8 / \ 6 10 / \ / \ 5 7 9 11输出:8, 6, 10, 5, 7, 9, 112. 分行从上到下打印二叉树从上到下打印出二叉树的每个节点,同...

2019-01-13 14:28:19 114 1

原创 [剑指Offer] 31_栈的压入、弹出序列

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例:序列{1, 2, 3, 4, 5}是一个压栈序列,{4, 5, 3, 2, 1}是该压栈序列的对应的一个弹出序列,但{4, 3, 5, 1, 2}就不可能是该压栈序列的弹出序列。思路用辅助栈模拟操作过程。不是弹出序列就意味着违反了栈的弹出规则,要弹出的元素...

2019-01-12 18:00:17 131

原创 [剑指Offer] 30_包含min函数的栈

题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路首先观察到min的时间复杂度是O(1),所以不可能是在我们调用min的时候再去计算栈中元素的最小值,最小值一定是提前保存好的。其次最小值必须随着push和pop更新,也就是最小值不可能是个单值,必须有办法回溯。因此,可以将最小值也做成一个栈,同步...

2019-01-12 16:43:33 77

原创 [剑指Offer] 29_顺时针打印矩阵

题目输入一个矩阵,按照从外向里以顺时针的顺序依次,打印出每一个数字。例:打印:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10思路按照书上的思路,每次打印一圈,一圈中又分为上右下左四条边,每一步打印前都做判断,是否打印。当打印圈的起点超过。时间复杂度:O(n)空间复杂度:O(1)建立一个打印队列,可以发现打印的元素规律为,未打印矩阵的【第...

2019-01-12 16:30:32 219

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除