Big-Yellow的算法工程师进阶之路
Big-Yellow的算法工程师进阶之路
一、基础算法
二、基础数据结构
2.1 链表[1]
2.1.1 基础理论
链表是一种以链的形式来存储数据的数据结构。链表的结构:每一个数据都与其后一个数据相连(有时候也与前一个数据相连)。链表中的每个元素都被称为一个结点, 在形状上链表就像自行车链条一样 一节接着一节
链表的优点
- 1、因为链表是一个链式的数据结构,你可以快速地添加和移除其中的元素。并且这也不需要像数组或者列表那样来重新组织数据。线性的数据结构用链表来实现更加容易。
- 2、同样因为它的链式结构,链表也不需要一个固定的或者初始的大小。
链表的缺点
- 1、与数组相比,链表占用更多的内存空间。这是因为你需要一个占用额外内存空间的指针来指向下一个元素。
- 2、在链表上执行搜索操作非常的慢。不像数组,你不能随机访问链表中的元素
链表使用
- 1、不知道数据列表中会有多少个元素(这是链表的一个优势 - 添加元素非常简单)。
- 2、不需要随机访问任何一个元素(与数组不同,你不能在链表中以一个特定的索引访问元素)。
- 3、要在数据列表的中间插入元素。
- 4、你需要以常数式时间从数据列表中插入和删除元素(与数组不同,你不需要先移动数据列表中的每一个其他元素)。
2.1.2 Python实现[2]
只需要意识到你将要添加到链表中的每一个元素都只是一个结点(就像链条中的一环)。头结点(链表中的第一个结点)的特殊之处在于你先确定一个头结点,然后再开始向它后面添加其他结点
1、单向链表****
- 创建链表
创建链表
class Node:
def __init__(self, val):
self.val = val # 存放数据
self.next = None # 指向下一个节点
- 定义链表
定义链表
class SingleLinkList(object):
"""单链表"""
def __init__(self):
self.head = None
def is_empty(self):
"""判断链表是否为空"""
return self.head is None
def length(self):
"""链表长度"""
cur = self.head
count = 0
while cur:
coun +=1
cur = self.head.next
return count
def item(self):
"""遍历链表"""
cur = self.head
while cur:
yield cur.val
# 指针下移
cur = cur.next
def add(self, val):
"""向链表头部添加节点"""
node = Node(val)
node.next = self.head
self.head = node
def append(self, val):
"""向链表尾部添加节点"""
node = Node(val)
if self.is_empty():
self.head = node
else:
cur = self.head
while cur.next:
cur = cur.next
cur.next = node
def insert(self, index, val):
"""指定位置插入元素"""
if index <0:
self.add(val)
else:
node = Node(val)
cur = self.head
for i in range(index- 1):
cur = cur.next
node.next = cur.next
cur.next = node
def remove(self, val):
"""删除节点"""
cur = self.head
pre = None
while cur:
if cur.next == val:
if not pre:
self.head = cur.next
else:
pre.next = cur.next
return True
else:
pre = cur
cur = cur.next
if __name__ == '__main__':
link_list = SingleLinkList()
# 向链表尾部添加数据
for i in range(5):
link_list.append(i)
# 向头部添加数据
link_list.add(6)
# 遍历链表数据
for i in link_list.item():
print(i, end='\t')
# 链表数据插入数据
link_list.insert(3, 9)
print('\n', list(link_list.item()))
# 删除链表数据
link_list.remove(0)
# 查找链表数据
print(link_list.find(4))
2.1.3 LeetCode习题
题目来源:
1、LeetCode官网
2、代码随想录
链表题解关键是断开连接然后去连接下一个,适当的临时节点(哨兵),防止后续指向不明确(不让指针迷路)
序号 | 名称 | 链接 | 难度 |
---|---|---|---|
1 | 翻转链表 | https://leetcode.cn/problems/reverse-linked-list/description/ | |
2 | 两两交换链表中的节点 | https://leetcode.cn/problems/swap-nodes-in-pairs/description/ |
问题解决思路
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
"""
问题一
""""
pre, cur = head, None
while pre is not None:
tmp = pre.next
pre.next = cur
cur = pre
pre = tmp
return cur
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
"""
问题二
""""
if head is None or head.next is None:
return head
pre, cur = head, head.next
mind = pre.next.next
cur.next = pre
pre.next = self.swapPairs(mind)
return cur
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
"""
问题二
先把所有的点都丢到哈希表中,而后通过哈希表找到要删除的元素,而后删除
"""
pre = ListNode(0, head)
node = pre
index = 0
tmp_list = {}
while node:
tmp_list[index]= node
node = node.next
index +=1
tmp_list[index- n- 1].next = tmp_list[index- n].next
return pre.next
三、LeetCode推荐习题
1、LRU缓存
题目链接:https://leetcode.cn/problems/lru-cache/description/
题目描述:请你设计并实现一个满足LRU (最近最少使用)
缓存 约束的数据结构。实现LRUCache
类:
LRUCache(int capacity)
以正整数作为容量capacity
初始化LRU
缓存int get(int key)
如果关键字 key 存在于缓存中,则返回关键字的值,否则返回\(-1\)。void put(int key, int value)
如果关键字 key 已经存在,则变更其数据值value
;如果不存在,则向缓存中插入该组key-value
。如果插入操作导致关键字数量超过capacity
,则应该 逐出 最久未使用的关键字。
函数get和put必须以\(O(1)\)的平均时间复杂度运行。
️解题思路:定义一个字典
对象去对值进行存储,因为put
或者get
操作都会对存储的对象进行修改,因此在执行上述两步操作之后需要对循序进行修改。对于get
操作就比较简单:只需要比较是否在字典
存在,存在则返回值并且修改顺序,反之则输出null
。(利用get
函数即可)。对于put
操作就复杂一点:首先判断是否存在:存在则需要将其放置都字典最后;不存在则需要判断是否超过了定义的capacity
如果没有就直接加入即可,有的话就需要将字典第一个元素进行替换(对于获取字典第一个元素可以使用生成器iter()
,生成器里面都是从最开始位置开始)。
问题描述

Code
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.data = dict()
def get(self, key: int) -> int:
s = self.data.get(key, -1)
if s != -1:
self.data.pop(key)
self.data[key]= s
return s
def put(self, key: int, value: int) -> None:
if key in self.data:
self.data.pop(key)
self.data[key] = value
else:
# 不在 data 里面的话:1、超过了容量,那么进行替代;2、没有超过容量:那么添加
if len(self.data) < self.capacity:
k = next(iter(self.data))
self.data.pop(k)
self.data[key] = value
else:
self.data[key] = value
2、背包问题
参考
Big-Yellow的算法工程师进阶之路的更多相关文章
- 运维工程师打怪升级进阶之路 V2.0
在此之前,发布过两个版本: 运维工程师打怪升级之路 V1.0 版本发布 运维工程师打怪升级必经之路 V1.0.1 很多读者伙伴们反应总结的很系统.很全面,无论是0基础初学者,还是有基础的入门者,或者是 ...
- AI算法工程师炼成之路
AI算法工程师炼成之路 面试题: l 自我介绍/项目介绍 l 类别不均衡如何处理 l 数据标准化有哪些方法/正则化如何实现/onehot原理 l 为什么XGB比GBDT好 l 数据清洗的方法 ...
- 浅谈Android进阶之路
过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事移动开 ...
- Java工程师修炼之路(校招总结)
Java工程师修炼之路(校招总结) 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易, ...
- Java工程师修炼之路(从小白到BAT的两年学习历程)
作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...
- python、数据分析师、算法工程师的学习计划
1.前言 最近(2018.4.1)在百忙之中开通了博客,希望能够把自己所学所想沉淀下来,这篇是我开始系统学习python,成为数据分析师和算法工程师之路的计划,望有志于为同样目标奋斗的数据猿一起交流和 ...
- 前端架构师亲述:前端工程师成长之路的 N 问 及 回答
问题回答者:黄轶,目前就职于 Zoom 公司担任前端架构师,曾就职于滴滴和百度. 1. 前端开发 问题 大佬,能分享下学习路径么,感觉天天忙着开发业务,但是能力好像没有太大提升,不知道该怎么充实自己 ...
- OpenCV进阶之路:神经网络识别车牌字符
1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...
- Web前端工程师成长之路
一.何为Web前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript/D ...
- Android研发进阶之路
前言 移动研发火热不停,越来越多人开始学习android开发.但很多人感觉入门容易成长很难,对未来比较迷茫,不知道自己技能该怎么提升,到达下一阶段需要补充哪些内容.市面上也多是谈论知识图谱,缺少体系和 ...
随机推荐
- css伪类和伪元素在项目中的使用-红色*显示
CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...
- 大数据面试题集锦-Hadoop面试题(五)-优化
你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案.如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料. 1. ...
- Jupyter Notebook支持Go
在执行下列命令之前,请确保你已经安装了Go和Jupyter. gophernotes是针对Jupyter和nteract的Go内核,它可以让你在基于浏览器的笔记本或桌面app上交互式地使用Go.下面介 ...
- [洛谷]P1967-最小生成树-好题推荐
[NOIP2013 提高组] 货车运输 题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\),城市之间有 \(m\) 条双向道路.每 ...
- Solon 框架启动为什么特别快?
思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...
- Linux和Windows系统下安装深度学习框架所需支持:Anaconda、Paddlepaddle、Paddlenlp、pytorch,含GPU、CPU版本详细安装过程
Linux和Windows系统下安装深度学习框架所需支持:Anaconda.Paddlepaddle.Paddlenlp.pytorch,含GPU.CPU版本详细安装过程 1.下载 Anaconda ...
- LyScriptTools 模块类API接口手册
LyScriptTools工具包是在LyScript模块基础上封装的工具包,其主要是二次封装LyScript插件实现的一些新功能,或者将特定功能组件拆分开形成的独立模块,此类模块可实现更加精细化的功能 ...
- 硬盘SMART信息解读
目录 一.SMART概述 4 二.SMART的ID代码 4 三.SMART的描述(Description) 5 四.SMART的值 5 1.临界 ...
- U390630 分考场题解
题目链接:U390630 分考场 本题来自于2019年蓝桥杯国赛的题.在洛谷上也被标为了假题.原因是首先官方在需要输出浮点数的情况下,并没有开启spj,并且官方所给的数据当中,总有一两个数据以不知道到 ...
- Oracle删除索引规范
1.背景概述 2.索引删除规范 3.根本解决方案及建议 1.背景概述 近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致 ...