第04章 Python算法与数据结构考察点
Python内置数据结构算法常考
你使用过哪些常用内置算法和数据结构
sorted
dict/ist/set/tuple
问题:想的不全或者压根没了解和使用过
常用内置数据结构和算法
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222601272-1637302667.png)
collections模块
有用过 collections 模块吗
collections模块提供了一些内置数据结构的扩展
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222602759-219966359.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222603667-915449802.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222604497-1658434542.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222605007-1088821883.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222605893-1501256464.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222606468-1779560708.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222606902-721886918.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222607328-1952580085.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222607724-1114926587.png)
Python dict底层结构
dict底层使用的哈希表
为了支持快速查找使用了哈希表作为底层结构
哈希表平均查找时间复杂度O(1)
CPython解释器使用二次探查解决哈希冲突问题
哈希冲突和扩容是常考题
探查法
Python list/tuple区别
list vs tuple
都是线性结构,支持下标访问
list是可变对象, tuple保存的引用不可变
list没法作为字典的key, tuple可以(可变对象不可hash)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222608368-46471445.png)
保存的引用不可变指的是你没法替换掉这个对象,
但是如果对系那个本身是一个可变对象,是可以修改这个引用指向的可变对象的
什么是 LRUCache?
Least-Recently-Used替换掉最近最少使用的对象
缓存剔除策略,当缓存空间不够用的时候需要一种方式剔除key
常见的有LRU,LFU等
LRU通过使用一个循环双端队列不断把最新访问的key放到表头实现
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222608977-1063106774.png)
如何实现 LRUCache
字典用来缓存,循环双端链表用来记录访问顺序
利用 Python内置的dict+ collections.OrderedDict实现
dict用来当做k/v键值对的缓存
OrderedDict用来实现更新最近访问的key
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222609856-56256967.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222610911-1713123536.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222611424-1229965629.png)
循环双端队列
Python算法常考题
算法常考点
排序+查找,重中之重
常考排序算法:冒泡排序、快速排序、归并排序、堆排序
线性查找,二分查找等
能独立实现代码(手写),能够分析时间空间复杂度
常用排序算法的时空复杂度
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222612048-1987536536.png)
Python数据结构常考题
Python web后端常考数据结构
◆常见的数据结构链表、队列、栈、二叉树、堆
◆使用内置结构实现高级数据结构,比如内置的 list/deque 实现栈
◆ Leetcode或者《剑指ofer》上的常见题
常考数据结构之链表
链表有单链表、双链表、循环双端链表
◆ 如何使用 Python来表示链表结构
◆ 实现链表常见操作,比如插入节点,反转链表,合并多个链表等
◆ Leetcode练习常见链表题目
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222612575-1489755708.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222613045-100721351.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222613410-265170749.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222614249-2069191733.png)
常考数据结构之队列
队列(queue)是先进先出结构
◆如何使用 Python实现队列?
◆实现队列的 apend和pop操作,如何做到先进先出
◆使用 Python的list或者 collections.deque实现队列
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222614682-802621691.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222615955-613984877.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222617099-1726771715.png)
常考数据结构之栈
栈(stack)是后进先出结构
◆如何使用 Python实现栈?
◆实现栈的push和pop操作,如何做到后进先出
◆同样可以用 Python list或者 collections.deque 实现栈
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222618294-220918073.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222619363-542811702.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222620357-202645126.png)
常考数据结构之字典与集合
Python dict/set底层都是哈希表
哈希表的实现原理,底层其实就是一个数组
◆根据哈希函数快速定位一个元素,平均査找O(1),非常快
◆不断加入元素会引起哈希表重新开辟空间,拷贝之前元素到新数组
哈希表如何解决冲突
链接法和开放寻址法
◆元素key冲突之后使用一个链表填充相同key的元素
◆开放寻址法是冲突之后根据一种方式(二次探査)寻找下一个可用的槽
◆ Cpython使用的二次探查
二叉树
先序、中序、后序遍历
◆先(根)序:先处理根,之后是左子树,然后是右子树
◆中(根)序:先处理左子树,然后是跟,然后是右子树
◆后(根)序:先处理左子树,然后是右子树,最后是根
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222620750-420133338.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222622010-643062964.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222622757-1019109829.png)
Python数据结构常考题之 堆
堆其实是完全二叉树,有最大堆和最小堆
最大堆:对于每个非叶子节点∨,V的值都比它的两个孩子大
◆最大堆支持每次pop操作获取最大的元素,最小堆获取最小元素
◆常见问题:用堆来完成topk问题,从海量数字中寻找最大的k个
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222623885-141549289.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222624358-2092380721.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222625547-1147264301.png)
什么是白板编程
传说中的手写算法题,白纸或者白板上手写代码
◆对于没有参加过ACM/蓝桥杯之类算法竞赛的同学比较吃亏
◆刷题。 LeetCode,《剑指 offer》,看 github题解
◆最近某大型互联网公司多年经验跳槽出来因为算法题面挂小公司
为啥要手写算法题
工作用不到,为啥还要考?
◆有些公司为了筛选编程能力强的同学,近年来对算法要求越来越高
◆针对刚出校门的同学问得多,有经验的反而算法考得少(偏工程经验)
◆竟争越来越激烈,大家水平差不多的优先选取有算法竞赛经验的
如何准备
没有太多好的方式,刷常见题。防止业务代码写多了算法手生
◆刷题, LeetCode常见题。看《剑指 offer》之类的面试算法书
◆面试之前系统整理之前做过的题目,不要靠记忆而是真正理解掌握
◆打好基础是重点,面试可以刷常见题突击,保持手感
面试前练习
刷题( leetcode+剑指 offer+看面经)
◆《剑指 offer》上常见题目用 Python实现
◆把 leetcode上常见分类题目刷一遍( github搜 leetcode分类)
◆常见排序算法和数据结构能手写
快排,归并
不会怎么办
针对没有算法竞赛经验的同学
- 有些公司是硬性标准,想要筛选参加过算法竞赛的同学
- 问面试官这种题目工作中的使用场景,还是想仅仅***难你
- 如果不会可以一点一点和面试官交流,解释下自己这方面较薄弱
Python数据结构常考题之——链表
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222626360-352429779.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222627132-905999635.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222627941-404487681.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222628668-778722410.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222629299-1121954929.png)
链表
链表涉及到指针操作较为复杂,容易出错,经常用作考题
熟悉链表的定义和常见操作
常考题:删除一个链表节点
常考题:合并两个有序链表
多写多练
找到相关的题目,多做一些练习
一般可能一次很难写对
尝试自己先思考,先按照自己的方式编写代码,提交后发现问题
如果实在没有思路或者想参考别人的思路可以搜题解
Python数据结构常考题之二叉树
二叉树
二叉树涉及到递归和指针操作,常结合递归考察
二叉树的操作很多可以用递归的方式解决,不了解递归会比较吃力
常考题:二叉树的镜像
常考题:如何层序遍历二叉树(广度优先)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222629753-400297334.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222630404-940743786.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222630925-1750824201.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222631411-650064523.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222631972-414540987.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222632671-1800167752.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222633709-506999984.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222634360-725981822.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222635046-2026590846.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222635885-2030245080.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222636687-1270306865.png)
数据结构之堆
堆的常考题基本围绕在合并多个有序(数组/链表);TopK问题
理解堆的概念,堆是完全二叉树,有最大堆和最小堆
会使用 Python内置的 heapq模块实现堆的操作
常考题:合并k个有序链表 leetcode merge-k- sorted-ist
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222637221-432016640.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222638195-2072717646.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222639015-265164278.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222639869-1228273556.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222640366-1235689847.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222641064-928477636.png)
Python字符串常考算法题
字符串题
了解常用的字符串操作
Python内置了很多字符串操作,比如 split, upper, replace等
常考题:翻转一个字符串
常考题:判断一个数字是否是回文数
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222641606-22163601.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222642114-7763388.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222642658-553104548.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222643118-1122982930.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222643584-311981126.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222644193-2005034209.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222645189-1328657861.png)
![](https://img2020.cnblogs.com/blog/1165731/202102/1165731-20210217222645714-1168703710.png)
反转链表
链表在面试中是一个高频考点( leetcode reverse-linked-list)
如何反转一个单链表?
你能使用循环的方式实现吗?
能否用递归的方式实现?