0
点赞
收藏
分享

微信扫一扫

Python剑指Offer学习总结【持续更新】

窗外路过了谁 2022-02-19 阅读 40
python

为了熟练python和算法,此次使用Python3刷题。由于过往Python多半直接使用,基础了解极少,刷题同时会记录一些Python有关的知识点。

目录

Python

基础内容

函数名相关

self
Python规定在类下,函数的第一个参数是实例对象本身。1

__init__()
两个下划线开头的函数是私有函数,外部无法使用或访问。init函数主要用于初始化类中变量。

函数中的->
用于标记该函数返回值的类型。

List

顺序表2

顺序表即按照顺序将数据地址连续的存储在内存的一处地方。有两种结构的顺序表:一体式结构和分离式结构。
为了在内存中开辟一块区域来连续存放就需要告诉它要多少地,如果后续数据溢出还需要重新申请空间。

一体式结构顺序表:将头信息(容量、目前元素个数)和元素数据放在一起。
优点:整体性强,易于管理。
缺点:扩充时,头信息和元素需要一起切换到新区域。需要更改顺序表对象。
在这里插入图片描述
分离式结构顺序表:将头信息和元素分开存放,并将元素地址给头信息从而建立链接。
优点:扩充时,只要修改头信息后的链表地址,使得顺序表对象地址无需改变。
在这里插入图片描述
List数据结构
Python的list结构是一种分离式技术的动态顺序表,是Stack。

List扩充
1.线性增长:每次扩充固定数量的存储位置。优点:节省空间。缺点:遇到扩充大空间时,操作次数多。(时间换空间)
2. 指数增长:每次扩充的容量加倍。优点:操作次数少,但浪费空间资源。(空间换时间)

List寻址
由于list可以存储不同类型数据,所有有两种寻址方法。
1.存储相同类时:相同类型所占字节一致,可以根据逻辑和物理地址计算偏移量寻址,时间复杂度O(1)
2. 存储不同类型:由于字节数不同,所以此时存储元素地址,元素外置。时间复杂度O(1)。

其他
内置函数len()的时间复杂度也是O(1),因为底层会维护一个size变量,在append时候就做记录。

剑指Offer

归纳类型,题目解释,多种做法

Stack&Queue

剑指09

基本思路:stack1存储,stack2辅助删除。
方法1:自己的拉胯方法。把CQueue完全当成queue来处理,遇到删除时,stack1所有内容反向推给stack2,除了最后一个,然后再从stack2反向推给stack1,维持次序。
时间复杂度:O(n),两次for循环。
在这里插入图片描述
方法2:好一点的方法。把两个stack分开看,第一次出现delete,就把stack1的内容反向推给stack2,除了最后一个。这样保证在这次delete之前的内容都已经反向,stack2只要pop就一定是队头。即使在stack2中还有内容时,我们往stack1中append也不影响stack2的delete。
什么时候返回-1,就是在stack2中没有delete了,然后发现stack1中也没内容反推至stack2了。
时间复杂度:O(n),一个循环
在这里插入图片描述在这里插入图片描述

剑指30

基本思路:一个主要stack存数据,一个辅助栈aux帮助减少找到最小值的时间复杂度。
方法1:第一反应,啥玩意啊,一个min()完事了,O(n)也不错了。
方法2:好吧要O(n)还要我写算法干什么,那就想怎么去除min()的O(n)变成O(1)。
top不用说直接[-1]或者peek()进行返回;push的时候用辅助aux来及记录当前情况下stack的最小值;pop的时候stack正常pop,然后存储此值来和aux最后一个值做对比,看是否pop了当前最小值,是的话aux也要pop;min直接返回aux的最后一个值。
图在pad上,待画


  1. 函数相关链接:init,-> ↩︎

  2. List相关链接 ↩︎

举报

相关推荐

0 条评论