树
二叉树二叉树是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子节点引用、右子节点引用。
Python:
123456class TreeNode: """二叉树节点类""" def __init__(self, val: int): self.val: int = val # 节点值 self.left: Optional[TreeNode] = None # 左子节点引用 self.right: Optional[TreeNode] = None # 右子节点引用
Go:
1234567891011121314/* 二叉树节点结构体 */type TreeNode struct { Val int Left *TreeNode Right *TreeNode}/* 节点初始化方法 */func Ne ...
哈希表
哈希表哈希表,又称散列表,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 key ,则可以在 O(1) 时间内获取对应的值 value 。
除哈希表外,数组和链表也可以实现查询功能,它们的效率对比如下所示。
添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 O(1) 时间。
查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 O(n) 时间。
删除元素:需要先查询到元素,再从数组(链表)中删除,使用 O(n) 时间。
数组
链表
哈希表
查找元素
O(n)
O(n)
O(1)
添加元素
O(1)
O(1)
O(1)
删除元素
O(n)
O(n)
O(1)
在哈希表中进行增删查改的时间复杂度都是 O(1) ,非常高效。
常用操作Python:
123456789101112131415161718192021222324252627282930# 初始化哈希表hmap: dict = {}# 添加操作# 在哈希表中添加键值对 (key, value)hma ...
栈、队列、双向队列
栈栈是一种遵循先入后出的逻辑的线性数据结构。如下图所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫做“入栈”,删除栈顶元素的操作叫做“出栈”。
栈常用操作栈的常用操作如下表所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、pop()、peek() 命名为例。
表 栈的操作效率
方法
描述
时间复杂度
push()
元素入栈(添加至栈顶)
O(1)
pop()
栈顶元素出栈
O(1)
peek()
访问栈顶元素
O(1)
Python:
12345678910111213141516171819202122# 初始化栈# Python 没有内置的栈类,可以把 List 当作栈来使用 stack: list[int] = []# 元素入栈stack.append(1)stack.append(3)stack.append(2)stack.append(5)stack.append(4)# 访问栈顶元素peek: int = stack[-1]# 元素出栈pop: int = ...
数组、链表、列表
常见数据结构常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图,它们可以从“逻辑结构”和“物理结构”两个维度进行分类。
逻辑结构可被分为“线性”和“非线性”两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列;非线性结构则相反,呈非线性排列。
线性数据结构:数组、链表、栈、队列、哈希表。
非线性数据结构:树、堆、图、哈希表。
非线性数据结构可以进一步被划分为树形结构和网状结构。
线性结构:数组、链表、队列、栈、哈希表,元素之间是一对一的顺序关系。
树形结构:树、堆、哈希表,元素之间是一对多的关系。
网状结构:图,元素之间是多对多的关系。
物理结构反映了数据在计算机内存中的存储方式,可分为连续空间存储(数组)和离散空间存储(链表)。物理结构从底层决定了数据的访问、更新、增删等操作方法,同时在时间效率和空间效率方面呈现出互补的特点。
所有数据结构都是基于数组、链表或二者的组合实现的。例如,栈和队列既可以使用数组实现,也可以使用链表实现;而哈希表的实现可能同时包含数组和链表。
基于数组可实现:栈、队列、哈希表、树、堆、图、矩阵、张量(维度 ≥3 的数组)等。
基于链表可实 ...
永久免费使用Axure最新版教程
首先去官网下载最新的axure,你没听错,就是最新的。
下载网址:Axure RP - UX Prototypes, Specifications, and Diagrams in One Tool
下载完后解压安装到本地,并注册属于你自己的账户,开始试用。可惜的是只有30天的试用日期。
本次永久使用axure的方法就是修改axure的启动时间,以达到永久试用的效果。
接下来介绍一款软件:RunAsDate
官网:RunAsDate - Run a program with the specified date/time (nirsoft.net)
选择适合你电脑的版本进行下载:
打开你下载的压缩包,双击RunAsDate.exe:
按图示设置相关参数(可自定义),然后点击新建快捷方式,我的命名跟原来的快捷方式命名一致:
这下当你打开新的快捷方式(并且和原来的一模一样,可以选择删掉旧的),神奇的事情发生了,咱们还有两万多天的试用期:
也就是说,永久使用axure成功了!
ps:以上方法仅供个人测试,还请低调试用,商业使用还请寻找官方渠道获得授权。若试用不成功请自行解决或 ...
迭代、递归、时间复杂度、空间复杂度
迭代迭代是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。
for 循环for 循环是最常见的迭代形式之一,适合预先知道迭代次数时使用。
Python:
1234567def for_loop(n: int) -> int: """for 循环""" res = 0 # 循环求和 1, 2, ..., n-1, n for i in range(1, n + 1): res += i return res
Go:
123456789/* for 循环 */func forLoop(n int) int { res := 0 // 循环求和 1, 2, ..., n-1, n for i := 1; i <= n; i++ { res += i } return res}
while循环与 for 循环类似,while 循环也是一 ...
Git使用——GitHub项目回退版本
查看历史版本使用git log命令查看项目的历史版本:
可以一直回车,直到找到想要的历史版本,复制commit后面的那一串id。
恢复历史版本执行命令 git reset --hard 版本号:
1git reset --hard 39ac3ea2448e81ea992b7c4fdad9252983dca2fe
推送到远程main分支1git push origin main --force
注意你的分支名要对应上。
完美解决Ubuntu网络故障,有线连接异常,IP地址一直显示127.0.0.1
终端输入ifconfig显示虚拟机IP地址为127.0.0.1,具体输出内容如下:
123456789wxy@ubuntu:~$ ifconfiglo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 1142 bytes 80042 (80.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1142 bytes 80042 (80.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这种情况我遇到了很多次,只需要一行命令 ...
从入门到渐入佳境——记我的第六届字节青训营经历
为什么参加 参加第六届字节青训营之前,我也参加了今年5-6月的第五届青训营,最初是在我们学校一个工作室群里看到的,是一个学长发出来的,当时看到了非常感兴趣,想着是学点新知识,因为当时我差不多就比较会python,但是用这个做后端开发的厂很少,或者都是一些小厂,出于对当前行情的判断,很多大厂都逐渐将业务往golang靠拢,甚至字节已经全面拥抱了go语言,并且还自研了HTTP框架hertz和微服务框架kitex,当时就觉得字节好厉害,如果能来青训肯定能扩宽自己的视野,于是就报名了第五届青训营,那时候的话还是golang小白,就是纯纯啥也不会,相信大家看过字节内部课的都知道,内部课的节奏整体偏快,更加适合一些对golang有了解的同学,或者是其他语言基础非常扎实的同学,看字节内部课的效率就会相应的高一些,我在看wkc老师讲的第一次课就有些跟不上,雀氏我又瞄了下第二次课,更别提有多痛苦了,于是当初我选择去b站找golang入门课看,看的是千锋的韩茹老师的课,当时的5-6月还在学校上课,后面到了期末考试前,也还在不停的学习go语言,差不多我的第五届就在入门golang中度过了,虽然“混”到了 ...
Gin+微服务实现视频上传到七牛云
如果你对Gin和微服务有一定了解,看本文较容易。
安装执行命令:
1go get github.com/qiniu/go-sdk/v7
获取凭证Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key,这对密钥可以通过如下步骤获得:
点击注册🔗开通七牛开发者帐号
如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key
准备好这四个基本配置,供后面使用:
SecretKey = your secretkey
AccessKey = your accesskey
Bucket = your bucket
Domain = your domain
Gin处理由于proto文件是这样定义的:
1234message PublishRequest{ // @inject_tag: json:"data" form:"data" bytes data = 1; // ...