- 博客(50)
- 收藏
- 关注
原创 利用是否为空指针来跳过第一次比较--LeetCode 530. 二叉搜索树的最小绝对差
利用 BST 的中序遍历特性可以将问题简化为“找相邻节点最小差”;使用pre指针记录上一个节点的值可以避免额外数组;巧妙利用pre!= nil,跳过第一次比较,简洁又安全!
2025-06-18 00:05:55
144
原创 Linux中的前台(同步)运行 或 后台(异步)运行
写法后台运行断开终端是否继续日志重定向推荐程度✅❌(会挂掉)❌一般❌(前台)✅默认写到nohup.out中等✅✅✅(可指定)✅ 最推荐✅✅✅✅ 最推荐后台程序的输出去哪了?我如何查看?
2025-05-24 18:24:10
785
原创 了解性文章 如果面试中 我拿到一道题目,我怎么知道是用什么方法呢?
🚨刷题初期不要强行判断用哪种算法,先写暴力,写熟不同题型后,识别能力自然会提高!
2025-05-23 22:35:25
648
原创 贪心算法套路模板+详细适用场景+经典题目清单
会议室 II(类似区间最大重叠数,也可用贪心管理资源)面额有贪心最优结构,如常见硬币(1、5、10、25)用最少数量的箭射爆气球(与跳跃范围相似)区间调度问题:选出最多互不重叠的区间。区间覆盖问题:用最少区间覆盖某个范围。买卖股票的最佳时机 III(结合DP)买卖股票的最佳时机 IV(结合DP)零钱兑换(DP推荐,贪心不一定适用)划分字母区间(字符串贪心和区间结合)依次选择满足条件的区间(如不重叠)无重叠区间(最少移除使区间不重叠)用最少数量的箭射爆气球(区间覆盖)最佳买卖股票时机含冷冻期(DP)
2025-05-23 22:07:25
1289
原创 动态规划应用场景 + 代表题目清单(模板加上套路加上题单)
单序列:dp[i] = max(dp[j]) + 1 (j < i 且 nums[j] < nums[i])双序列:dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]+1) 依赖匹配关系// 0/1 背包(从大到小)for i := 0;i < n;i++ {j-- {// 完全背包(从小到大)for i := 0;i < n;
2025-05-23 21:52:03
1226
原创 动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移
i是当前状态j是过去状态if 条件成立,说明可以从过去j走到现在i就是取过去所有能转移过来的路径中最优的那一条for i := 1;i < n;j < i;j++ {// 某种条件成立这类“双重 for + 状态转移”的写法,在一类特定的动态规划问题中非常经典和高频。
2025-05-23 21:23:17
643
原创 完全背包问题中「排列数」与「组合数」的核心区别
目标外层循环内层循环特点组合数(无序)遍历物品i遍历容量j顺序不会重复排列数(有序)遍历容量j遍历物品i会计算所有顺序[1,1,2][2,1,1][1,2,1]是同一种组合。所以我们只想知道「有哪些组合方式」,不在意顺序。目标外层循环结果特性会不会重复顺序组合数物品在外不计顺序不会排列数背包在外顺序不同都算会。
2025-05-15 15:31:07
509
原创 5.12 go小公司面试 面经
6. map是否是线程安全的,怎么解决线程安全的办法。2. 介绍一下你的分布式缓存系统(没答好)3. 介绍一下 make 和new 的区别。8 介绍一下 tcp三次握手,为什么不两次。4. 向一个关闭的channel的读和写。5. 介绍一下GMP模型。1.介绍一下你的技术栈。7 线程和协程的区别。
2025-05-12 17:12:48
116
原创 面试中常问的设计模式及其简洁定义
模式名常被问到解释(简洁)单例模式✅ 高频保证一个类只有一个实例,并提供全局访问点。工厂模式✅ 高频创建对象的接口由子类决定,屏蔽了对象创建逻辑。抽象工厂模式✅提供多个产品族的一组工厂方法。建造者模式✅将复杂对象的构建过程拆分,并允许按步骤构建。原型模式✅通过复制已有对象来创建新对象。策略模式✅ 高频封装一组可互换的算法,并使它们之间可以替换。观察者模式✅ 高频对象之间一对多依赖关系,通知所有观察者对象。适配器模式✅转换接口,使原本不兼容的接口协同工作。装饰器模式✅。
2025-05-11 20:55:26
931
原创 HTTP 和 WebSocket 的区别
协议简要定义HTTP一种基于请求-响应模式的、无状态的应用层协议,通常用于客户端与服务器之间的数据通信。WebSocket一种全双工通信协议,可以在客户端和服务器之间建立持久连接,实现实时、低延迟的数据传输。项目HTTPWebSocket连接方式请求-响应全双工是否持久连接否是通信效率相对较低高服务端能否主动发消息否可以常用场景页面加载、REST API实时聊天、推送、直播协议升级无初次通过 HTTP,之后升级协议。
2025-05-11 20:42:50
1499
1
原创 01 背包和完全背包 遍历的顺序
01 背包反向走,完全背包正向走。一个不能重复选,一个必须重复选!如果你用的是二维数组dp[i][j],遍历顺序的本质和一维数组一样,关键区别只在于你是否允许重复选物品(完全 or 01)。背包类型i遍历j(容量)遍历方向原因01 背包从 0 到 n反向j = N ➝ 0防止本轮重复选完全背包从 0 到 n正向j = 0 ➝ N支持多次选多重背包从 0 到 n通常反向,或展开为多个01背包具体看实现01 背包反着走,dp[i-1] 看前头;完全背包正着走,dp[i] 行内抠。
2025-05-11 00:50:21
575
原创 卡特兰数--
给定 n 个节点,构建满足 AVL 高度平衡条件的二叉树的方案数,在某些简化条件下也呈现卡特兰数的增长趋势。的操作数序列,在不改变操作数顺序的前提下,通过加括号来确定乘法顺序的方式有 n-1 个卡特兰数种。在使用栈构造特定不下降子序列(如栈排序问题)时,某些构造路径数也可以转化为卡特兰数的问题。将一个凸 n+2 边形,用 n−1 条不相交对角线划分成 n 个三角形。对 n 个矩阵 A₁A₂…例如:n = 3(6 个点)时,有 5 种不相交连线方法。例如:当 n = 3 时,有 5 种不同形态的二叉树。
2025-05-06 20:42:52
836
原创 gRPC 的使用和了解
刚刚我们对 gRPC 的四种调用方式进行了探讨,但光会用还是不够的,知其然知其所然很重要,因此我们需要对 gRPC 的整体调用流转有一个基本印象,那么最简单的方式就是对 Client 端调用 Server 端进行抓包去剖析,看看整个过程中它都做了些什么事。一元 RPC,也就是是单次 RPC 调用,简单来讲就是客户端发起一次普通的 RPC 请求,响应,是最基础的调用类型,也是最常用的方式。服务器端流式 RPC,也就是是单向流,并代指 Server 为 Stream,Client 为普通的一元 RPC 请求。
2025-04-27 17:11:33
1172
原创 Go RPC 服务方法签名的要求
方法必须是导出的。方法的第一个参数是请求参数,必须是结构体(值类型或指针类型)。方法的第二个参数是响应参数,必须是指针类型。返回值是error类型,用于表示调用是否成功。方法调用是同步的,客户端会等待服务端完成后再返回结果。
2025-04-27 16:51:49
683
原创 小公司面经,当练手了
linux 常用吗?说一下啊vim常用命令,删除文件啥的。redis 单线程还是多线程 为啥这么快?公司的紧急事务和个人的时间如何取舍你咋看。JWT 怎么实现的,JWT被盗用了咋办。channel 了解嘛?缓存穿透 缓冲击穿 缓存雪崩。redis 常见的 数据结构。slice 有了解嘛?nginx 了解过嘛?日志管理是基于什么实现的。http下面是什么协议?rpc有哪些数据结构。
2025-04-21 16:37:22
343
原创 goland做验证码识别时报“undefined: gosseract.NewClient”(Windows系统)
这个错误表明在编译过程中,gosseract 依赖的 Leptonica 库无法找到,具体是 leptonica/allheaders.h文件。Leptonica 是一个用于图像处理的 C 库,Tesseract 依赖它进行图像操作。解决这个问题的方法是确保 Leptonica 库被正确安装并在你的系统中能够被找到。gosseract 应该有 和 c 相关的配置库因此需要安装 cgo 并且启用 CGO_ENABLED。然后需要安装Mingw,相当于 Linux里面的 gcc。接着 又报了这个错误。
2025-04-18 14:42:20
630
原创 Go 语言的 map 在解决哈希冲突时,主要使用了链地址法同时参考了开放地址法的思想即每个桶的 8个 key val对是连续的
链地址法:Go 通过桶和溢出桶链表的设计来解决哈希冲突。高效存储:每个桶最多存 8 个键值对,且键值对是连续存储的,减少了内存碎片。优化哈希查找:存储了键的高 8 位哈希值,加速了查找过程。
2025-04-15 17:14:40
556
原创 golang的slice扩容过程
Go 语言中的切片扩容机制是 Go 运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存。在扩容时,Go 会根据当前切片的容量和预期的容量进行计算,并分配新的内存空间,拷贝原有数据。扩容的策略通常是小容量时翻倍,大容量时逐步增加,保证了内存的高效使用。最终,容量达到 16。它的实现会首先检查当前切片的容量是否足够容纳新的元素,如果不够,它会调用。如果新容量大于原容量的两倍,它会直接使用新容量作为目标容量。:为了避免频繁扩容,最好在创建切片时预估切片需要的容量,尤其是在元素数量已知的情况下。
2025-04-15 14:56:48
929
原创 计算机内部如何存储整型数据及其符号区别
int8和 uint8int8能表示负数,而uint8只能表示正数和零。int8的范围是 -128 到 127,而uint8的范围是 0 到 255。byte和rune是 Go 中的别名,分别代表无符号字节(uint8)和 Unicode 字符(int32转换时,int8和uint8之间的转换会导致不符合预期的结果(如负数转换为大正数),这与计算机的补码表示法有关。
2025-04-15 11:24:31
806
原创 当一个 Goroutine(G) 从 running → runnable 的过程中,它被放到哪里?
状况被放置的位置Gosched()/ 主动让出 CPU当前P的本地队列尾部系统调用返回 / 网络事件唤醒全局队列新创建的 Goroutine优先本地队列,后全局队列本地 runq 满了(超出 256 个 goroutine)一部分偷给全局队列。
2025-04-14 15:35:18
319
原创 区分阻塞与系统调用时,Goroutine 会被放在哪里
情况状态变化暂时位置被唤醒后放置位置阻塞(channel, lock 等)running→waiting资源的等待队列(如 sudog 链)当前 P 的本地队列 或全局队列系统调用running→syscall不在 runq,中断当前调度关系全局队列 或 直接调度执行。
2025-04-14 15:33:48
575
原创 GMP获取可以执行的协程的过程
因此,主要的流程是按照本地队列 → 全局队列 → 网络事件 → 窃取工作 → 空闲状态的顺序来寻找可执行的 Goroutine。时,会从全局队列尝试获取一个 Goroutine,这样可以确保公平性,避免两个 Goroutine 占据本地队列进行不停的互相复生。如果本地队列没有可执行的 Goroutine,且全局队列也为空,会检查是否有网络事件(如网络 I/O)。如果网络轮询已经初始化并且有等待事件,会尝试从网络事件中获取一个可执行的 Goroutine。如果成功,会返回一个 Goroutine。
2025-04-14 15:13:47
405
转载 go的Etcd服务注册发现实例
这篇文章简单介绍了服务注册与发现的流程、核心概念以及 etcd 实现对应功能的命令,最后结合商城实现了一个简单的实例并进行简单测试,结果符合预期。
2025-04-10 13:51:48
93
原创 刷leetcode有感之判断素数的优化写法
由于除了 2 以外,所有的素数都是奇数,所以可以先判断这个数是否为 2 或者是否能被 2 整除,如果是 2 则为素数,如果能被 2 整除且不是 2 则不是素数。之后,只需要从 3 开始,每次增加 2 进行遍历判断,这样就可以减少一半的遍历次数,提高效率。奇数遍历: 从 3 开始,每次增加 2 进行遍历,直到 i 大于该数的平方根。如果 num 能被 i 整除,则返回 false,表示不是素数。
2025-04-04 00:32:37
137
1
原创 Go 标准库中包含了一些基础的数据结构
Go 标准库中包含了一些基础的数据结构,主要分布在。,可以双向遍历,适用于高频插入/删除操作的场景。,可以调整成最大堆(Max-Heap)。插入、删除操作的时间复杂度为。,适合高频创建销毁对象的场景。,必须使用遍历查找元素。适合读多写少的情况。
2025-04-03 15:45:18
465
原创 Go语言中的slices 包
slices提供了一系列用于切片操作的高效函数。包的常用函数列表及其用途。如果你的 Go 版本。,让代码更简洁高效!
2025-04-02 23:36:16
400
原创 刷Leetcode有感 74. 搜索二维矩阵 Go 语言 sort.Search 使用解析:matrix[i/n][i%n] >= target 与 matrix[i/n][i%n] == targe
进行二分查找时,我们经常需要定义一个单调递增的判断条件。,这样可以确保单调性,避免索引越界,并保证查找结果正确。中的不同作用,并解释为什么前者更适合作为查找条件。断断续续出现,而不是单调递增。的回调函数中,如果直接使用。),否则查找结果可能不准确。进行二分查找时,应使用。,甚至导致数组访问越界(
2025-04-02 23:06:10
186
原创 Redis缓存穿透、击穿、雪崩问题
🔥数据在缓存和数据库中都不存在,导致所有请求都打到数据库,可能引发数据库崩溃。黑客可以利用不存在的 ID 或数据进行攻击,造成缓存穿透。当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db中如果有就会将其丢到缓存中,但是有些key对应更多数据在db中并不存在,每次针对此次key的请求从缓存中取不到,请求都会压到db,从而可能压垮db。
2025-03-28 23:57:29
493
原创 基于小问题,来讲解Redis 分布式限流器的实现逻辑
问题:如果我的限流器 在创建的是只创建了对/auth进行限流,如果进来一个 /v1/tag的url就没法限流了这个是创建限流器RedisLimiter 限流器中的具体实现方法RedisLimiter 被调用的中间件 ,第一个if 这个中间件在执行的时候有问题。我的限流器 在创建的是只创建了对/auth进行限流,如果进来一个 /v1/tag的url就没法限流了✅ 当前的代码确实存在一个:它,对于未显式配置的 URL(如/v1/tag),不会进行限流!🚫。
2025-03-28 22:27:44
823
原创 ✅ Git 提交代码的完整流程
Git 提交代码的完整流程(详解)在团队协作开发中,使用 Git 提交代码是一项常见操作。为了保证代码同步、避免冲突,规范的提交流程非常重要。以下是两种常用的 Git 提交流程,分别适用于日常提交和存在大量未提交代码时的情况。
2025-03-28 14:54:06
4422
3
原创 PATCH 的作用 和 PUT的区别
🚀 1️⃣ PATCH 的作用✅ 示例: → 将 的用户整体替换为新数据。 → 仅修改 用户的邮箱字段,其他字段保持不变。
2025-03-25 11:13:21
279
转载 GORM 中同一个 *DB 对象污染问题的分析与解决
要理解为什么会出现“污染”问题,我们需要了解 GORM 内部如何管理查询条件的。GORM 中的大部分链式调用都会将查询条件保存在一个名为。在使用 GORM 进行数据库操作时,链式调用可能会导致查询条件污染。例如,当你在查询时添加了分页条件(为了保留原先的查询条件,并确保后续查询不受影响,关键是让 GORM 在调用。完全分离,保留原有的查询条件,又不会受到后续分页条件的影响。),这些分页条件可能会影响到统计查询(的语句,却意外影响到了统计总数(,会在新的 Session 中将。,这应该会导致创建一个全新的。
2025-03-25 00:10:49
55
原创 解决 Gorm 中链式查询污染的问题有几种常见的解决方法
创建新的会话实例,避免查询链共享状态。传递独立的*gorm.DB实例:确保每个查询都使用不同的数据库会话,避免污染。避免共享全局*gorm.DB实例:尽量确保每次查询都是独立的。事务管理:对于需要多个查询的操作,可以使用事务来管理,但仍需注意每个查询的独立性。
2025-03-25 00:07:01
461
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人