- 博客(525)
- 资源 (1)
- 收藏
- 关注
原创 07-多线程篇
文章摘要 本文档整理了一系列Java线程相关的面试题及解答,难度和出现频率以星级标注(1-5星)。 线程基础 线程与进程的区别:线程是CPU调度的最小单位,进程是资源分配的最小单位;线程共享进程内存,切换成本更低。 并行(多核同时执行)与并发(单核时间片轮转)的差异。 线程创建方式 四种方法:继承Thread类、实现Runnable/Callable接口、线程池。Callable支持返回值,需配合FutureTask获取结果。 线程状态与转换 状态包括NEW(新建)、RUNNABLE(可运行)、BLOCKE
2026-08-17 11:08:28
133
原创 链表-19. 删除链表的倒数第 N 个结点
摘要: 题目要求删除链表的倒数第N个节点。采用双指针(快慢指针)+虚拟头节点的方法: 快指针先走N步,与慢指针拉开N的距离; 两指针同步移动至快指针到链表末尾,此时慢指针指向待删节点的前驱; 通过修改指针跳过待删节点。虚拟头节点简化了删除首节点的边界处理。时间复杂度O(L)(L为链表长度),空间复杂度O(1)。
2026-04-23 09:54:35
165
原创 链表-2. 两数相加
的,正好对应加法从个位开始算,我们只要模拟「竖式加法」的过程,同时处理进位,把每一位的结果拼成新链表即可。和上一题合并链表一样,用一个空的虚拟头节点,方便拼接结果链表,不用单独处理第一个节点的边界情况。
2026-04-23 09:37:00
390
原创 链表-21. 合并两个有序链表
摘要: 本文介绍了合并两个有序链表的算法。核心思路是通过双指针遍历两个链表,每次选择较小的节点接入新链表。使用虚拟头节点简化边界处理,当任一链表遍历完后,直接将剩余部分拼接到新链表末尾。该算法时间复杂度为O(n+m),空间复杂度O(1),是一种高效的迭代解法。代码实现清晰展示了比较、拼接和剩余处理的完整逻辑,适用于所有有序链表的合并场景。
2026-04-23 09:13:24
205
原创 链表-142. 环形链表 II
本文通过数学推导解释了如何找到环形链表的入口节点。关键结论是:头节点到环入口的距离等于相遇点到环入口的距离。算法使用快慢指针,快指针速度是慢指针的2倍。当两指针相遇时,将其中一个指针重置到链表头,然后两指针同速前进,最终会在环入口相遇。时间复杂度O(n),空间复杂度O(1)。
2026-04-22 09:50:17
229
原创 链表-141. 环形链表
摘要: 本文介绍了使用快慢指针(Floyd判圈算法)检测链表是否有环的方法。慢指针每次移动1步,快指针移动2步。若无环,快指针会先到达链表末尾;若有环,快指针最终会追上慢指针。代码通过while(fast!=null && fast.next!=null)确保遍历安全,相遇返回true,否则返回false。该方法时间复杂度O(n),空间复杂度O(1),高效且边界处理完善。
2026-04-22 09:19:41
39
原创 链表-234. 回文链表
本文介绍了判断链表是否为回文的解题方法。核心思路分为三步:首先通过快慢指针找到链表中点,将链表分为前后两部分;接着反转后半部分链表;最后逐个比较前后两部分的节点值是否相同。该方法时间复杂度为O(n),空间复杂度为O(1),通过原地操作实现了高效判断。关键点在于正确处理链表的分割、反转和比较三个环节,确保逻辑正确性的同时保持代码简洁。
2026-04-21 11:09:00
314
原创 链表-206. 反转链表
本文介绍了反转链表的双指针解法。核心思路是使用pre和cur两个指针遍历链表,每次将当前节点指向前一个节点,并保存下一个节点防止断链。具体步骤:初始化pre为null,cur为头节点;循环中先用临时变量保存cur.next,反转cur的指向,移动pre和cur指针;最终返回pre作为新链表头。该方法通过O(n)时间复杂度和O(1)空间复杂度高效完成反转。
2026-04-21 10:50:13
177
原创 链表-160. 相交链表
本文介绍了LeetCode 160题"相交链表"的解法。核心思路是使用双指针法:两个指针h1和h2分别从链表A和B的头节点出发,当走到链表末尾时切换到另一个链表的头部继续遍历。这样两个指针走过的总步数相同,最终会在交点相遇(若无交点则同时到达null)。该方法通过巧妙的指针切换实现了O(m+n)时间复杂度和O(1)空间复杂度的解决方案。
2026-04-21 10:36:13
41
原创 06-常见集合篇
这篇文章主要讲解了数据结构中的List和Map相关面试题,重点分析了ArrayList、LinkedList、HashMap和ConcurrentHashMap等集合类的底层实现原理。文章首先介绍了算法复杂度分析的重要性,详细讲解了时间复杂度和空间复杂度的计算方法,并通过具体代码示例演示了O(1)、O(n)、O(log n)等常见复杂度类型的分析过程。随后深入探讨了数组的底层存储机制和寻址公式,为后续集合类的学习打下基础。全文通过图示和代码示例相结合的方式,帮助读者理解数据结构的核心概念和性能分析方法,适合
2026-04-20 12:05:57
451
原创 矩阵-240. 搜索二维矩阵 II
这篇文章介绍了在二维矩阵中高效搜索目标值的算法。通过利用矩阵行列有序的特性,从右上角开始搜索:当当前值等于目标时直接返回;若当前值较小则下移排除本行,较大则左移排除本列。时间复杂度为O(m+n),空间复杂度O(1)。文章提供了Java实现代码,包含核心解题逻辑和完整的输入输出处理,适合面试和大厂机考场景。该方法通过逐步缩小搜索范围,实现了对有序二维矩阵的高效查找。
2026-04-20 10:42:34
48
原创 矩阵-48. 旋转图像
这篇文章介绍了如何原地旋转一个二维矩阵(顺时针90度)。核心思路是分层处理,从外到内逐层旋转。每一层通过四个角的交换实现旋转:先用临时变量保存左上角的值,然后依次将左下角移到左上角、右下角移到左下角、右上角移到右下角,最后将临时变量值放到右上角。通过循环收缩边界(left++和right--)处理内层,直到所有层旋转完成。文章提供了完整的Java代码示例,包含输入输出处理,适用于大厂机考标准。该方法时间复杂度为O(n²),空间复杂度为O(1),是一种高效的原地算法。
2026-04-19 11:04:25
58
原创 矩阵-54. 螺旋矩阵
本文介绍了力扣54题“螺旋矩阵”的解法,采用边界收缩法模拟顺时针遍历过程。通过定义左、右、上、下四个边界,按顺序遍历并收缩边界,同时及时判断边界越界以避免重复访问。算法时间复杂度为O(m×n),空间复杂度为O(1)。提供了完整的Java实现代码,包含控制台输入输出处理,并强调了边界判断的必要性,防止在特殊矩阵情况下出现重复遍历问题。
2026-04-15 09:56:51
226
原创 矩阵-73. 矩阵置零
摘要: 本文介绍了LeetCode 73题“矩阵置零”的原地算法解决方案。核心思路是利用矩阵的第一行和第一列作为标记数组,记录需要置零的行列位置。通过额外变量zeroRow处理第一行的特殊情况,避免标记覆盖。算法分为四步:标记处理、根据标记置零、处理第一列和第一行。提供了Java实现代码,包括核心解法和大厂机考版完整代码,满足O(1)空间复杂度要求,适用于面试场景。
2026-04-14 10:12:14
48
原创 05-消息中间件篇
本文总结了RabbitMQ和Kafka在消息中间件应用中的关键解决方案。RabbitMQ部分涵盖消息不丢失保障(生产者确认、持久化、自动重试)、重复消费处理(幂等性检查)、死信交换机实现延迟队列、消息堆积应对策略(多线程/消费者、惰性队列)以及高可用集群部署。Kafka部分重点阐述消息可靠性机制(异步回调、副本同步)、顺序消费控制(分区策略)、高可用架构(ISR副本选举)和性能优化设计(分区/零拷贝/批量发送)。两者均通过分布式架构和多种技术手段确保消息系统的可靠性、顺序性和高性能,为不同业务场景提供灵活的
2026-04-13 16:33:09
514
原创 普通数组-41. 缺失的第一个正数
摘要: 题目要求在O(n)时间、O(1)空间内找到数组缺失的最小正整数。核心思路是通过原地哈希,将数字k交换到下标k-1的位置,使数组下标与值匹配。步骤如下: 原地交换:遍历数组,将1~n范围内的数字放到对应位置(避免死循环需判断nums[i] != nums[nums[i]-1])。 校验结果:再次遍历,首个不满足nums[i]=i+1的位置即为缺失数;若全匹配则返回n+1。 关键点:交换时需用临时变量保存值,防止覆盖;循环条件需处理重复数字。代码通过双循环实现,高效且节省空间。 示例输入: 3 3 4
2026-04-13 10:07:33
336
原创 普通数组-238. 除了自身以外数组的乘积(数组、前缀和)
摘要: 本文介绍了力扣238题(除自身以外数组乘积)的解法,核心思路是利用前缀积和后缀积数组。前缀积prefix[i]表示nums[0..i-1]的乘积,后缀积suffix[i]表示nums[i+1..n-1]的乘积,最终结果answer[i] = prefix[i] * suffix[i]。该方法时间复杂度O(n),空间复杂度O(n),避免了除法运算。文章提供了Java实现代码,包括初始化前缀/后缀积数组和计算结果的完整流程,适合面试或机考场景。
2026-04-12 20:07:00
145
原创 04-微服务篇
本文总结了Spring Cloud微服务架构的关键知识点,包括五大核心组件(Eureka/Ribbon/Feign/Hystrix/Gateway)及Nacos等替代方案。重点阐述了服务注册发现机制、负载均衡实现(Ribbon策略及自定义方法)、服务雪崩解决方案(降级/熔断)以及SkyWalking监控方案。在业务层面,详细介绍了限流算法(漏桶/令牌桶)、CAP/BASE理论、Seata分布式事务、接口幂等性设计以及xxl-job的任务调度策略。这些技术要点构成了微服务架构的核心解决方案,涵盖了服务治理、性
2026-04-11 16:47:37
634
原创 普通数组-189. 轮转数组
本文介绍了力扣189题"轮转数组"的最优解法——三次反转法。该方法通过三次反转操作实现数组轮转:首先反转整个数组,然后反转前k个元素,最后反转剩余元素。这种解法时间复杂度为O(n),空间复杂度为O(1),满足题目进阶要求。文章提供了完整的Java实现代码,包括核心方法和辅助方法,并强调了关键知识点:取模运算处理k值、双指针反转技巧、Java数组特性等。该解法是面试和机考中的标准最优解,具有高效、节省空间的特点。
2026-04-11 10:42:59
407
原创 普通数组-56. 合并区间
摘要: 本文介绍了合并重叠区间的贪心算法解决方案。首先对区间按起点排序,然后遍历每个区间,通过比较当前区间的起点与已合并区间的终点来判断是否重叠:若不重叠则保存当前合并结果并重置区间;若重叠则更新终点为两者最大值。最后将结果转换为二维数组返回。提供了完整的Java实现代码,包含输入处理和关键方法解析,如区间排序、动态列表操作及结果转换等。该算法时间复杂度为O(nlogn),适用于中等规模区间合并问题。
2026-04-10 15:23:06
347
原创 普通数组-53. 最大子数组和
本文介绍了求解最大子数组和问题的Kadane算法。该算法基于动态规划思想,通过维护当前子数组和(curSum)和全局最大值(res)来高效求解。核心逻辑是:若当前子数组和为正则继续累加,否则从当前元素重新开始。算法时间复杂度为O(n),空间复杂度为O(1),是最优解法。文中提供了Java实现代码,包括标准动态规划版本和空间优化版本,并解释了算法正确性。该算法适用于需要找到连续子数组最大和的场景,是动态规划的经典应用案例。
2026-04-08 10:29:30
229
原创 字串-76. 最小覆盖子串
本文介绍了LeetCode 76题“最小覆盖子串”的解题方法。该题采用滑动窗口和哈希表的组合策略:用双指针维护窗口,右指针扩展窗口直至包含目标字符串t的所有字符,左指针收缩窗口以找到最小满足条件的子串。具体步骤包括:统计t的字符需求,滑动窗口扩张时更新字符计数,当窗口满足条件时收缩左边界并记录最小窗口。文末提供了Java实现代码和关键知识点,如HashMap方法、字符串操作及滑动窗口的核心逻辑。
2026-04-07 12:19:55
326
原创 字串-239. 滑动窗口最大值
摘要: 本文介绍了LeetCode 239题「滑动窗口最大值」的最优解法——单调双端队列。通过维护一个存储索引的单调递减队列,确保队首始终为当前窗口最大值。关键步骤包括:1) 队列存索引而非值;2) 动态维护窗口边界;3) 新元素入队前弹出较小值;4) 窗口形成后收集结果。提供了Java实现代码,并详细解析了双端队列的核心操作(判空、头尾存取/删除)。该算法时间复杂度为O(n),空间复杂度为O(k),适合处理大规模数据。
2026-04-04 17:00:37
214
原创 03-SSM框架
本文总结了Spring框架及MyBatis相关的常见面试问题及答案,主要内容包括: Spring单例bean的线程安全问题及解决方案 AOP原理及实际应用场景 Spring事务实现机制及失效场景 bean生命周期和循环依赖解决机制 SpringMVC执行流程 SpringBoot自动配置原理 常用注解汇总(Spring、SpringMVC、SpringBoot) MyBatis执行流程、延迟加载原理及缓存机制 二级缓存清理时机 这些问题涵盖了Spring框架核心概念、实际应用场景和常见解决方案,适合作为面试
2026-04-04 11:14:26
390
原创 字串-560. 和为 K 的子数组
本文介绍了一种高效解决"和为K的子数组"问题的方法。核心思路是利用前缀和与哈希表优化: 前缀和原理:通过pre[j]-pre[i]计算子数组和,转化为寻找pre[i]=pre[j]-k的配对问题。 哈希表优化:实时存储前缀和出现次数,将时间复杂度从O(n²)降至O(n)。 关键实现:初始化哈希表记录pre[0]=1,遍历时查询curSum-k的出现次数并累加结果。 该方法通过空间换时间,显著提升了算法效率,适用于处理大规模数组的子数组和问题。
2026-04-03 10:51:19
165
原创 滑动窗口-438. 找到字符串中所有字母异位词
本文介绍了力扣438题“找到字符串中所有字母异位词”的滑动窗口解法。通过维护固定长度的窗口,使用哈希表统计字符出现次数,当匹配数等于目标字符种类数时记录结果。核心思路是双指针遍历字符串,时间复杂度O(n)。代码实现中重点使用了Map的getOrDefault、containsKey等方法进行字符统计,并提供了机考版本的完整代码示例,包含输入输出处理。该解法高效且易于理解,适合处理此类字符串匹配问题。
2026-04-02 10:03:00
297
原创 零代码AI项目开发部署(DeepSeek+Cursor+Devbox)课程总结
本课程主打"不写代码搞定项目开发部署",通过AI工具组合实现5小时从设计到上线的全链路交付。课程采用DeepSeek大模型进行需求分析与设计,Cursor编辑器生成代码,Devbox+Sealos完成部署,涵盖数据库设计、前后端开发、权限管理等实战内容。特色在于AI全流程覆盖、10倍效率提升和零基础友好,适合编程小白、毕业生及希望提效的开发者。课程最终交付可直接上线的完整项目,并掌握AI时代的开发工作流。
2026-04-01 19:43:05
192
原创 03.SpringAI
SpringAI整合了全球主流大模型,为开发者提供便捷的模型调用接口。它根据输入输出类型对模型分类,重点支持对话模型(Chat Model),涵盖19种主流模型如Anthropic Claude、Azure OpenAI等。各模型功能差异显著:部分支持多模态输入(文本/图像/音频)、工具调用、流式输出等功能;少数具备本地部署和OpenAI API兼容性。该框架简化了大模型开发流程,为不同应用场景提供灵活选择。
2026-04-01 19:33:24
784
原创 02-MySQL篇
本文总结了MySQL性能优化相关的常见问题与解决方案,包括慢查询定位、索引优化、SQL语句优化、事务处理以及分库分表等。主要内容涵盖:通过监控系统或慢查询日志定位慢SQL;使用EXPLAIN分析执行计划;索引的底层数据结构(B+树)及其优缺点;聚簇/非聚簇索引的区别及回表查询;超大分页处理技巧;索引创建原则与失效场景;SQL语句优化方法;事务ACID特性与隔离级别实现;主从同步原理;分库分表的实际应用场景等。这些优化策略可有效提升MySQL数据库性能。
2026-04-01 11:56:26
394
原创 什么是哈希算法?(大白话+原理+应用,一次讲透)
哈希算法摘要:哈希算法将任意输入转换为固定长度的哈希值,具有确定性、单向性和抗碰撞性。核心原理是通过计算直接定位存储位置,使 HashSet 的查找操作达到 O(1) 时间复杂度,远优于 List 的 O(n) 遍历。其应用包括数据结构优化(如 HashSet)、密码存储、文件校验和区块链等。哈希碰撞通过链地址法或红黑树解决。在算法优化中(如滑动窗口问题),哈希算法通过快速定位显著提升性能。
2026-04-01 11:19:02
1031
原创 滑动窗口-3. 无重复字符的最长子串
本文介绍了力扣题目"无重复字符的最长子串"的滑动窗口解法。核心思路是使用左右指针维护一个无重复字符的窗口:右指针扩展窗口,左指针在发现重复字符时收缩窗口,并用集合记录窗口内的字符。代码实现中,通过遍历字符串,动态调整窗口边界并更新最大长度。文章还提供了Java实现代码,并讲解了使用的String方法charAt()和length()。该解法时间复杂度为O(n),空间复杂度为O(字符集大小),是解决此类问题的经典方法。
2026-04-01 11:07:36
308
原创 双指针-42. 接雨水
摘要:42.接雨水问题采用双指针解法,通过左右指针遍历数组并记录两侧最大值。核心思路是比较左右最大值,较小值决定当前位置的接水量。时间复杂度O(n),空间复杂度O(1)。Java代码实现包括双指针逻辑和边界处理,同时提供了机考版本代码,支持从标准输入读取数据并输出结果。该方法高效简洁,适用于解决类似雨水收集问题。
2026-03-31 11:45:59
177
原创 双指针-15. 三数之和
本文介绍了力扣15题"三数之和"的Java解法,采用双指针法解决该问题。首先对数组排序,然后固定一个元素,使用左右指针寻找满足三数之和为0的组合,并通过跳过重复元素来优化性能。代码实现中使用了Arrays.sort()排序和Arrays.asList()生成结果列表。文章还总结了算法题中常用的5个Arrays方法:排序(sort)、打印(toString)、转List(asList)、二分查找(binarySearch)和数组复制(copyOf),这些方法在算法解题中最为实用。
2026-03-30 17:10:52
352
原创 双指针-11. 盛最多水的容器
本文介绍了使用双指针法解决盛水容器问题的方案。题目要求在给定的高度数组中找到能盛最多水的容器。通过设置左右两个指针,计算当前区域的面积并移动较小高度的指针,逐步逼近最优解。Java实现展示了O(n)时间复杂度的解法,包括力扣题解和机考代码示例。核心思想是利用双指针高效遍历数组,通过比较指针处的高度动态调整指针位置,确保在单次遍历中找到最大盛水面积。这种方法避免了暴力枚举,显著提升了算法效率。
2026-03-28 10:55:36
57
原创 CORS 跨域问题&解决方法
CORS跨域是浏览器安全机制,当协议、域名或端口不同时会拦截请求。Spring Boot可通过全局配置解决:创建CorsConfig类实现WebMvcConfigurer接口,配置/**路径允许所有来源、常用请求方法和请求头,关闭Cookie传递。该方案开发环境通用,生产环境建议限制具体前端地址。
2026-03-27 16:35:44
224
原创 深度学习/AI 方向显卡 + 大模型 + 论文术语 全总结
本文总结了深度学习/AI方向的显卡选择、大模型部署和论文术语要点。主流显卡中,RTX 4090(24GB)是深度学习黄金配置,RTX 3060(12GB)可运行7B参数模型。大模型部署方面,24GB/48GB显卡无法运行671B大模型,但支持7B/13B模型的量化推理和轻量微调。使用方式推荐云端API调用或本地轻量微调,RTX 4090完全满足硕士论文实验需求。论文术语需掌握Baseline(基线模型)和SOTA(当前最优方法)。最终结论指出无需部署满血大模型,建议采用云端API+本地微调7B/13B模型的
2026-03-27 12:15:06
300
原创 算法-Collection(List、Set) & Map 大厂机考核心方法+遍历总结
本文总结了Java集合框架在算法机试中的核心用法,重点涵盖Collection、List、Set和Map的常用方法及遍历方式。主要内容包括: Collection通用方法:add/remove/size/contains等基础操作,推荐使用增强for循环遍历 List特有方法:基于索引的get/set/add操作,支持普通for循环遍历 Set核心特性:自动去重,仅支持增强for/迭代器遍历 Map高频用法:put/get/containsKey等方法,推荐keySet和entrySet两种遍历方式 机考速
2026-03-27 11:45:28
701
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅