- 博客(61)
- 收藏
- 关注
原创 LeetCode 138.随机链表的复制 Java
分阶段处理:将复杂问题拆分为“构建结构”和“处理随机指针”两个阶段,降低思考难度。哈希表的作用:通过map2建立原节点到新节点的快速查找,解决了random指向“未知节点”的问题。虚拟头节点的使用:简化了新链表next指针的构建,避免了单独处理第一个节点的特殊逻辑。空指针处理:注意random可能为null,代码中需要显式判断,避免空指针异常。
2026-03-22 00:15:33
393
原创 LeetCode 56.合并区间 Java
排序的必要性:排序使得我们可以按顺序处理区间,确保不会遗漏任何可能的重叠贪心策略:每次只考虑当前区间与已合并区间列表中的最后一个区间,这种局部最优选择能导致全局最优解重叠判断:理解当前区间起始 ≤ 前一个区间结束是判断重叠的关键条件边界处理:注意区间起始和结束的包含关系,特别是当[1,4]和[4,5]这种情况时,它们被认为是重叠的。
2025-12-08 16:02:59
423
原创 面试必问——MySQL 索引创建的原则
如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL时,它可以更好地确定哪个索引最有效地用于查询。要控制索引的数据量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率就高。,**分组(group by)**操作的字段建立索引。针对数据量比较大,且查询比较频繁的表建立索引。
2025-12-05 13:47:40
269
原创 面试必问——MySQL 覆盖索引,超大分页优化
分析:子查询直接走覆盖索引查出了9000000-后十条的id(因为走的覆盖索引,所以性能高),然后再拿这些id去主表查询,这样性能有很大提升。**问题:**在数据量比较大时,limit分页查询,需要对数据进行排序,效率低。是指查询使用了索引,并且需要返回的列,在该索引中已经全部找到。能够比较好地提高性能。
2025-12-05 13:27:43
173
原创 面试必问——MySQL 聚簇索引和非聚簇索引,回表查询
什么是聚簇索引,什么是二级索引(非聚簇索引)?聚簇索引的选取规则:回表查询:总结:1. 什么是聚簇索引,什么是非聚簇索引:2. 回表查询:
2025-12-04 08:38:57
404
原创 面试必问——MySQL 索引概念及底层数据结构
是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向数据),这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。MySQL的InnoDB引擎采用的B+树的数据结构来存储索引。
2025-12-04 08:28:23
170
原创 面试必问——MySQL 如何分析慢SQL
的连接类型,性能由好到差为NULL,system,const,eq_ref,ref,range,index,all(实际开发中最低要求也要限制在range)possible_keys:当前sql可能会使用到的索引。(通过key和key-len查看是否可能会命中索引)key:当前sql实际命中的索引。key-len:索引占用的大小。Extra:额外的优化建议。
2025-12-01 16:11:29
344
原创 面试必问——Mysql 如何定位慢查询
配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件记录的信息。运维工具:Prometheus,Skywalking。调试工具:Arthas。
2025-12-01 15:59:33
168
原创 面试必问——Redis网络模型
Redis是纯内存操作,执行速度非常快采用单线程,避免了不必要的上下文切换,多线程还要考虑线程安全问题采用多路复用模型非阻塞Redis是纯内存操作的,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,多路复用模型主要就是实现了高效的网络请求主要有三种实现方式:select,pool,epool。
2025-11-27 14:38:51
684
原创 面试必问——Redis分片集群
个哈希槽,每个key通过CRC16校验后对16384取模来决定放置在哪个槽,集群的每个节点负责一部分hash槽.Redis分片集群引入哈希槽的概念,Redis集群有。
2025-11-27 14:28:45
199
原创 面试必问——Redis 哨兵模式
如果master故障,Sentinel会将一个slave提升为master,当故障实例恢复之后也以新的master为主(旧的master会被降级为slave)。Sentinel基于心跳机制检测服务状态,每隔1秒向集群的每个实例发送ping命令:(如果回pong,就说明实例健康)min-replicas-to-write 1 表示最少的salve节点为1个(即一个主节点最少得有一个从节点):Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给客户端。
2025-11-26 13:57:34
310
原创 面试必问——Redis 主从同步
偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。salve完成同步时也会记录当前同步的offset。如果salve的offset小于master的offset,说明salve的数据落后于master,需要更新。:简称replid,是数据集的标记,id一致则说明是同一个数据集。每个master都有唯一的replid,salve则会继承master节点的replid。:单点的Redis的并发能力是有限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
2025-11-26 13:50:39
680
原创 面试必问——Redis分布式锁
*RedisLock(红锁):**不能只在一个redis实例上创建锁,应该在多个实例上创建锁(n/2+1),避免在一个redis实例上加锁。(实现复杂,性能差,运维繁琐)是SET if not exists(如果不存在,则SET)的简写。获取锁:(设置超时时间,防止死锁)
2025-11-25 14:50:43
316
原创 面试必问——Redis 数据淘汰策略
对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。:对全体key,基于LRU(最近最少使用)算法进行淘汰。不淘汰任何key,但是内存满时不允许写入新数据,:对设置了TTL的key,基于LRU算法进行淘汰。:对设置了TTL的key,基于LFU算法进行淘汰。:对全体设置了TTL的key,随机进行淘汰。:对全体key,基于LFU算法进行淘汰。:对全体key,随机进行淘汰。
2025-11-25 14:35:02
264
原创 面试必问——Redis数据过期策略
每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除 其中的过期key):设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之则返回该key。:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放。:对cpu友好,只会在使用该key时才会及进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。
2025-11-21 15:00:50
278
原创 面试必问——Redis 数据持久化
全称Redis Database Backup file (Redis数据备份文件),也叫Redis数据快照。:因为是记录命令,所以AOF文件会比RDB文件大的多。当主进程执行写操作,则会拷贝一份数据,在这个份数据上进行写操作,当然此时的读,也是在这份数据上操作。Redis处理的每一个写命令都会记录在这个AOF文件中,可以看做事命令日志。:各自有各自的优缺点,如果对数据安全性要求高,在实际开发中往往会结合两者来使用。命令,可以让AOF文件执行重写功能,用最少的命令达到达到相同的效果。
2025-11-21 14:28:39
252
原创 面试必问——Redis 双写一致
当修改了数据库的数据时也要同时更新缓存的数据,缓存和数据库的数据要保持一致性。读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间。(redisson有提供)
2025-11-18 22:32:36
392
原创 面试必问——Redis 缓存 三兄弟(穿透,击穿,雪崩)一文讲清楚
给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。:逻辑过期(不给数据加过期时间,而是在value中维护一个expire逻辑过期时间,有线程来查询数据时,判断数据是否过期,过期则。:实现比较复杂,存在误判(误判率是可以调节的,数组长度越长,误判率越低,但是对应的内存消耗也越大)的数据,mysql查询不到数据也不会写入缓存,就会导致每次请求都查数据库。:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存。
2025-11-18 14:59:27
641
原创 nacos服务心跳检测底层原理——结合Java源码
服务注册成功后,会周期性(默认5秒)的向nacos发送心跳请求,告诉nacos"我还活着",nacos接收到请求后,会更新这个实例的“最后心跳时间戳”,然后nacos会有一个定时任务(默认5秒每次),会定期检查服务中的所有实例,判断当前时间与每个服务“最后心跳时间戳”的差值,差值大于15秒,认为实例可能挂了,但是不会立即删除,当差值大于30时,认为真的挂了,注销删除实例,并通知订阅该服务的消费者,实例健康发生变化
2025-10-27 14:03:14
693
原创 微服务项目部署配置文件示例:从开发到生产的完整指南
networks:ipam:config:网络设计优势:服务发现:容器间通过服务名直接通信网络隔离:与宿主机网络隔离,提高安全性IP 管理:固定子网段便于管理和故障排查本文通过 XiaoXOJ 项目的实际案例,详细介绍了微服务项目的 Docker 化部署配置。环境分离:基础设施与业务服务分开部署配置管理:多环境配置与集中式配置中心结合网络设计:自定义网络实现服务隔离与通信数据持久化:卷挂载确保数据安全健康管理:完善的健康检查与自动恢复机制。
2025-10-02 23:17:38
970
原创 Docker 部署微服务项目详细步骤
本文详细介绍了使用Docker部署微服务项目的完整步骤。首先需要准备合理的项目目录结构,为每个微服务创建包含基础配置的Dockerfile文件。然后编写docker-compose.yml文件,定义MySQL、Redis、RabbitMQ、Nacos等基础设施容器,以及用户服务、题目服务、判题服务和网关等业务服务容器。文件配置了各服务的环境变量、端口映射、数据卷挂载和网络设置,并确保服务间的依赖关系。最后通过Docker Compose实现一键部署整套微服务系统,包含Nginx反向代理配置。
2025-09-28 15:02:59
489
原创 【无标题】
摘要: JavaScript处理大整数时存在精度丢失问题,如后端返回的ID 1971803447926321153在前端变为1971803447926321200。这是由于JS使用64位双精度浮点数表示数字,安全整数范围仅为±(2^53-1)。解决方案包括:1)后端将Long类型转为字符串;2)前端使用json-bigint解析;3)显示时转换为字符串。最佳实践是后端统一配置Jackson序列化,前端配合axios拦截器处理,确保大数字传输和显示的准确性。
2025-09-28 12:29:08
367
原创 Linux系统编译java文件为class文件bug全解析:依赖顺序错误+跨平台通配符解析失效
摘要:开发Java代码沙箱时,编译环节踩中两大坑:1) 单独编译导致依赖错乱,需用javac *.java统一编译以避免类找不到问题;2) Linux环境下Java程序执行通配符编译失败,因Shell未展开*.java。解决方案改用ProcessBuilder显式传递文件路径列表,绕过Shell解析,确保跨平台兼容性。核心教训:理解Java编译依赖机制和系统级命令执行差异,才能构建稳定的代码沙箱。(149字)
2025-09-05 03:39:25
1068
原创 LeetCode 08.06 面试题 汉诺塔 (Java)
个大小不同的盘子,盘子初始按升序堆叠在第一根柱子上(最小的在顶部)。通过递归重复这三个步骤,最终完成所有盘子的移动。递归终止条件是当盘子数量为。在顶部,满足小盘在大盘之上的规则。该解法直接修改原列表,符合原地操作要求。汉诺塔问题的核心思想是将问题分解为三个步骤(假设有。在汉诺塔问题中,有 3 根柱子和。
2025-06-07 17:03:12
1213
原创 LeetCode 118 杨辉三角 (Java)
通过记忆化优化递归解法,我们既保持了数学定义的直观性,又获得了与迭代法相当的效率。杨辉三角作为经典数学概念,其高效生成算法展示了递归优化技术的强大威力。递归+记忆化:更贴近问题数学定义迭代法:实现更简洁,无递归开销理解这两种解法的核心在于掌握递归关系的优化技巧,这对解决动态规划类问题具有重要指导意义。
2025-06-07 16:19:25
1194
原创 LeetCode 70 爬楼梯(Java)
方法时间复杂度空间复杂度适用场景记忆化搜索OnO(n)OnOnO(n)On递归思路清晰动态规划OnO(n)OnOnO(n)On无栈溢出风险优化动态规划OnO(n)OnO1O(1)O1最优解,推荐使用通项公式O1O(1)O1O1O(1)O1理论价值高,精度受限关键点状态定义dp[n]表示到达第n阶的方案数转移方程边界处理面试技巧:先给出递归思路,再逐步优化到动态规划,最后给出空间优化版本,展示算法优化能力!
2025-06-05 14:27:27
1107
原创 LeetCode_LCR 509 斐波拉契
方法时间复杂度空间复杂度适用场景直接递归O2nO(2^n)O2nOnO(n)On仅限极小的n记忆化搜索OnO(n)OnOnO(n)On通用,但递归有栈开销动态规划OnO(n)OnOnO(n)On无栈溢出风险优化动态规划OnO(n)OnO1O(1)O1最优解,推荐使用关键优化思想避免重复计算:通过缓存中间结果(记忆化或动态规划)。空间压缩:仅保留必要的前两个状态,将空间复杂度降至常数级。面试提示。
2025-06-05 14:23:34
1194
原创 LeetCode 最大子数组和:动态规划解法详解 (Java)
摘要:本文详细介绍了解决最大子数组和问题的动态规划方法。通过定义状态dp[i]表示以nums[i]结尾的子数组最大和,利用转移方程dp[i] = max(dp[i-1]+nums[i], nums[i])递推求解。算法时间复杂度为O(n log n),空间复杂度O(n)。文章还提供了优化思路(如遍历取最大值可优化至O(n)),并通过示例推演展示计算过程。核心在于理解状态转移逻辑:当dp[i-1]为负时,舍弃前缀能获得更优解。该方法是解决连续子数组优化问题的经典范式。
2025-05-29 15:28:55
720
原创 力扣热题100(附刷题表版)
不仅方便查看题目,并且,在完成题目后,,我放在了结尾,大家自取,直接复制粘贴到。2. 字母异位词分组(中等)3. 最长连续序列(中等)1. 两数之和 (简单)时做记录,整理了下面。
2025-05-28 19:11:44
2065
原创 LeetCode LCR 010 和为 K 的子数组 (Java)
暴力枚举法思路简单,但仅适用于小规模数据。前缀和+哈希表通过空间换时间,将复杂度降至线性,是处理大规模数据的高效方法。特别注意哈希表的初始化与更新逻辑,确保正确处理所有边界情况。相关题目LeetCode 560. 和为K的子数组。
2025-05-17 02:10:16
552
原创 LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)
暴力滑动窗口法直观易懂,但时间复杂度较高,适用于小规模数据。优化后的动态滑动窗口通过减少重复计算,显著提升了效率,是解决此类问题的标准方法。核心在于维护窗口的字符频率差异,避免全量比对,将时间复杂度从 O(n * m) 优化到 O(n)。
2025-05-16 00:01:29
642
原创 LeetCode LCR 016. 无重复字符的最长子串 (Java)
• 空间复杂度:O(1),字符集大小固定(ASCII 最多 128 种字符)。• 收缩左边界:一旦发现重复,左指针右移一位,移除原左边界字符。• 左指针每次仅移动一位,逐步缩小窗口,确保窗口内始终无重复。• 每次左指针右移后,右指针从当前位置继续扩展,无需回溯。• 时间复杂度:O(n),左右指针各遍历一次字符串。• 扩展右边界:右指针不断右移,直到遇到重复字符。• 每个字符最多被左右指针各访问一次,无重复操作。表示当前窗口的左右边界,窗口内字符不重复。实时记录窗口内的字符,确保窗口的唯一性。
2025-05-13 15:47:39
559
原创 LeetCode LCR 007. 三数之和 (Java)
通过排序预处理,结合双指针高效寻找两数之和,同时在每一步跳过重复元素,确保结果唯一。这种方法巧妙地将时间复杂度降至 O(n²),是解决此类问题的经典思路。
2025-05-10 23:29:16
611
原创 LeetCode 11.盛最多水的容器 (Java)
双指针法的优势:通过一次遍历高效解决问题,避免暴力法的 O(n²) 复杂度。关键思想:移动较短的边以探索更高的板,确保不漏掉更大储水量的可能性。相似问题42. 接雨水15. 三数之和掌握双指针法的移动策略,能有效解决数组中的区间最优问题!
2025-05-08 14:00:20
1483
原创 LeetCode 283:移动零 (Java)
暴力法:思路直接但效率低,适合小规模数据。双指针法:高效且简洁,通过一次遍历解决问题,是本题最优解。相似问题27. 移除元素26. 删除有序数组中的重复项掌握双指针法的思想,能有效解决数组操作中的许多问题!
2025-05-08 09:30:27
1308
原创 LeetCode 128. 最长连续序列(Java)
暴力解法(如排序后遍历)的时间复杂度为 O(n log n),不满足题目要求。:利用哈希表(HashSet)快速查询元素是否存在,避免重复遍历。,找到其中最长的连续数字序列的长度。要求算法的时间复杂度为。循环向后查找连续的数,直到无法继续。存储所有元素,去除重复值。是某个连续序列的最小值。给定一个未排序的整数数组。遍历哈希表中的每个元素。,哈希表为空,直接返回。解释:最长连续序列是。
2025-05-07 11:37:05
924
原创 LeetCode LCR 033. 字母异位词分组
(字符出现次数相同但顺序不同的字符串)的字符串分组,并返回分组后的结果列表。,代码简洁且易于理解,适合面试快速实现。若追求极致性能,可尝试字符计数法。为每个字母分配一个质数,计算字符串的质数乘积作为键。用字符出现次数作为标识(例如。:避免字符串拼接或排序的开销。:可能溢出(需使用大整数)。),避免排序的时间开销。:字符串较长时更高效。
2025-05-06 16:20:15
1241
原创 LeetCode 1. 两数之和(Java)
尤其在处理大规模数据时,性能优势明显。在实际面试中,可以先写出暴力解法,再优化为哈希表法,展示对时间复杂度的敏感度。直接遍历数组中的每一对组合,检查它们的和是否等于。的两个数,并返回它们的下标。,且同一元素不能重复使用。当数组长度较大时(例如。(哈希表存储所有元素)
2025-05-06 14:46:12
738
原创 redis“缓存击穿“和“雪崩“形象解析
现象缓存击穿缓存雪崩攻击目标单个热点数据(茅台)大量缓存数据(所有促销商品)触发条件热点数据过期 + 高并发大量数据同时过期 + 高并发破坏力局部击穿(单点高压)全面崩溃(系统级瘫痪)
2025-04-22 14:05:36
457
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅