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、代码随想录

链表题解关键是断开连接然后去连接下一个,适当的临时节点(哨兵),防止后续指向不明确(不让指针迷路)

问题解决思路
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、背包问题

参考


  1. https://www.freecodecamp.org/chinese/news/introduction-to-linked-lists-in-python/

  2. https://zhuanlan.zhihu.com/p/60057180

Big-Yellow的算法工程师进阶之路的更多相关文章

  1. 运维工程师打怪升级进阶之路 V2.0

    在此之前,发布过两个版本: 运维工程师打怪升级之路 V1.0 版本发布 运维工程师打怪升级必经之路 V1.0.1 很多读者伙伴们反应总结的很系统.很全面,无论是0基础初学者,还是有基础的入门者,或者是 ...

  2. AI算法工程师炼成之路

    AI算法工程师炼成之路 面试题: l  自我介绍/项目介绍 l  类别不均衡如何处理 l  数据标准化有哪些方法/正则化如何实现/onehot原理 l  为什么XGB比GBDT好 l  数据清洗的方法 ...

  3. 浅谈Android进阶之路

    过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事移动开 ...

  4. Java工程师修炼之路(校招总结)

    Java工程师修炼之路(校招总结) 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易, ...

  5. Java工程师修炼之路(从小白到BAT的两年学习历程)

    ​ 作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...

  6. python、数据分析师、算法工程师的学习计划

    1.前言 最近(2018.4.1)在百忙之中开通了博客,希望能够把自己所学所想沉淀下来,这篇是我开始系统学习python,成为数据分析师和算法工程师之路的计划,望有志于为同样目标奋斗的数据猿一起交流和 ...

  7. 前端架构师亲述:前端工程师成长之路的 N 问 及 回答

    问题回答者:黄轶,目前就职于 Zoom 公司担任前端架构师,曾就职于滴滴和百度. 1. 前端开发 问题 大佬,能分享下学习路径么,感觉天天忙着开发业务,但是能力好像没有太大提升,不知道该怎么充实自己 ...

  8. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  9. Web前端工程师成长之路

    一.何为Web前端工程师?        前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript/D ...

  10. Android研发进阶之路

    前言 移动研发火热不停,越来越多人开始学习android开发.但很多人感觉入门容易成长很难,对未来比较迷茫,不知道自己技能该怎么提升,到达下一阶段需要补充哪些内容.市面上也多是谈论知识图谱,缺少体系和 ...

随机推荐

  1. NOI Linux 下 Geany 配置教程

    没有括号补全? 现在有自动括号补全了! 红色的 a.cpp 的意思是 a.cpp 没有保存. 现在来设置编译运行的快捷键. 不难推测 "%e" 是可执行文件的意思,"%f ...

  2. 开源IM项目OpenIM新版本发布-生产环境需更新

    项目简介 Android体验地址:https://www.pgyer.com/OpenIM 注册后自动加入组织,和群聊 群聊页面 工作台 工作台,业务可以通过jssdk自由扩展自身业务 工作圈 工作圈 ...

  3. NLP涉及技术原理和应用简单讲解【一】:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署)

    参考链接: https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/advanced/gradient_clip_cn.html 1. ...

  4. MySQL【一】基本使用----超详细教学

    相关文章: win10下MySQL安装教程(MySql-8.0.26超级详细)_丨汀.的博客-CSDN博客 1.RDBMS(Relational Databases Management System ...

  5. 数据共享Manager(Python)

    from multiprocessing import Process,Manager,Lock def change_dic(dic,lock): with lock: dic['count'] - ...

  6. 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(1)-初识Wireshark

    1.简介 前边已经介绍过两款抓包工具,应该是够用了,也能够处理在日常工作中遇到的问题了,但是还是有人留言让宏哥要讲解讲解Wireshark这一款抓包工具,说实话宏哥之前也没有用过这款工具,只能边研究边 ...

  7. React的组件通信与状态管理

    目录 1. 组件通讯-概念 1.组件的特点 2.知道组件通讯意义 总结: 2. 组件通讯-props 基本使用 1.传递数据和接收数据的过程 2.函数组件使用 props 3.类组件使用 props ...

  8. 关于laravel路由无法访问(nginx)

    laravel路由无法访问 被这个问题折腾了 好几次了,记录一下希望可以帮到后面的朋友 在laravel路由中配置好了之后无法访问的问题有可能是因为在本地服务配置的问题(我使用的是nginx服务器) ...

  9. ElasticSearch7.3学习(十二)----type底层结构及弃用原因

    1.type是什么 type,是一个index中用来区分类似的数据的.类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器.field的value. 在底层的lucene中 ...

  10. 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)

    可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...