- 博客(413)
- 收藏
- 关注
原创 史上最全!!!大厂面试真题-SpringBoot自动装配的原理是什么?
SpringBootApplication注解这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个核心注解。:表明该类是一个配置类,它实际上是一个@Configuration注解的派生注解,用于定义Bean和配置应用程序。:开启自动配置功能,通过@Import注解引入AutoConfigurationImportSelector类,该类负责扫描并加载自动配置类。
2024-09-22 13:04:35
1757
原创 Leetcode279:完全平方数
摘要 该问题要求找出和为给定整数n的完全平方数的最少数量。完全平方数是指可以表示为某个整数平方的数(如1,4,9等)。文中提供了三种解决方案:1)暴力解法,通过尝试所有可能的平方数组合来寻找最小值;2)基于数学规律的解法,利用观察到的平方数分解特性优化计算;3)数学定理解法,应用四平方和定理直接求解。三种方法的时间复杂度依次降低,其中最优解法能达到O(√n)时间复杂度。关键观察点是任何正整数最多需要4个平方数之和表示,且某些特定情况(如n%8==7)可直接确定结果。
2026-02-02 22:44:08
237
原创 Leetcode:97.交错字符串
摘要:本文提出使用动态规划方法验证字符串s3是否由s1和s2交错组成。定义二维数组dp[i][j]表示s1前i个字符和s2前j个字符能否组成s3前i+j个字符。初始化边界条件后,通过状态转移方程dp[i][j] = (dp[i-1][j]&&s1[i-1]==s3[i+j-1]) || (dp[i][j-1]&&s2[j-1]==s3[i+j-1])进行递推,最终返回dp[m][n]结果。该方法时间复杂度O(mn),空间复杂度O(mn),可通过滚动数组优化至O(n)。
2026-02-02 22:38:59
240
原创 大厂面试真题-说说Kafka消息的不重复和不丢失
Kafka通过多重机制确保消息"不重不丢":采用副本机制防止数据丢失,通过位移记录避免重复消费;生产者使用确认机制和幂等性发送,消费者通过自动提交位移保证精准消费。示例代码展示了Java实现的Kafka生产者和消费者,生产者每1秒发送一条消息,消费者持续轮询并处理消息,通过位移跟踪实现可靠消费。这些机制共同保障了消息的可靠传递和精确消费。
2026-02-01 19:29:40
261
原创 Leetcode会员尊享面试100题:1086:前五科的均分
Leetcode会员尊享面试100题:1086:前五科的均分 题目要求计算每个学生最高的五科成绩的平均分,并按学生ID升序排列结果。处理步骤为:1) 将数据按ID升序、分数降序排序;2) 遍历排序后的数据,对每个ID累加前五个最高分;3) 计算平均分时使用整数除法;4) 将结果按格式输出。示例中ID=1的学生平均分为87,ID=2的学生平均分为88。算法时间复杂度为O(nlogn),空间复杂度O(1)。
2026-02-01 19:27:07
131
原创 Leetcode会员尊享面试100题:333.最大二叉搜索子树
Leetcode会员尊享面试100题:333摘要: 本文提出了一种在二叉树中寻找最大二叉搜索子树(BST)的算法。通过后序遍历,递归获取每个子树的四个关键信息:是否为BST、节点数量、最小值和最大值。若当前树满足BST条件,则更新节点数;否则继承左右子树中的最大BST节点数。算法时间复杂度为O(n),适用于节点数达10^4的树。示例测试验证了算法的正确性,如输入[10,5,15,1,8,null,7]时输出3,对应子树[5,1,8]。核心类Info封装子树状态,getInfo方法动态计算并传递信息至根节点。
2026-01-31 22:55:42
147
原创 Leetcode会员尊享面试100题:255.验证二叉搜索树的前序遍历序列
Leetcode会员尊享面试100题:255.验证二叉搜索树的前序遍历序列 摘要:本文介绍了一个验证给定数组是否为二叉搜索树先序遍历序列的算法。算法通过递归检查每个子树的最小值、最大值以及BST属性来实现。对于每个节点,确保左子树所有值小于根节点,右子树所有值大于根节点。代码使用了辅助类Info存储子树信息,并通过二分查找确定左右子树分界点。时间复杂度为O(nlogn),空间复杂度为O(logn)。示例输入[5,2,1,3,6]返回true,而[5,2,6,1,3]返回false。
2026-01-31 16:04:24
192
原创 面试题:什么是时钟回拨问题?怎么解决
时钟回拨问题指分布式ID生成时服务器时间发生倒退,导致ID重复或错误。常见原因包括NTP同步、人为操作、硬件异常等。解决方案主要有:1)检测并等待时钟恢复;2)小幅度回拨时通过序列号补位;3)使用逻辑时钟替代物理时钟;4)参考成熟开源方案(如百度UidGenerator);5)监控告警与降级处理。不同方案各有优劣,需根据业务需求选择,其中记录时间戳和序列号补位是较成熟的实践方案。
2026-01-30 21:31:16
931
原创 面试题:知道CDN吗,说说秒杀系统中的CDN
摘要:CDN通过"就近缓存"和"高效分发"机制优化秒杀场景。活动前通过"缓存预热"将静态资源同步至各节点,JS中设置flag:false;活动开始时更新JS文件(flag:true)并添加随机参数触发CDN缓存更新。配合前端10秒请求限流机制,既减轻服务器压力,又确保用户及时获取最新状态。该方案通过CDN缓存策略与前端控制的协同,有效解决了高并发下的资源分发和系统稳定性问题。(149字)
2026-01-30 21:29:34
259
原创 面试场景题:请设计一个微信朋友圈系统
摘要:本文提出一个高并发朋友圈系统的设计方案,采用微服务架构分层实现。系统核心包括发布、展示、互动和权限服务,通过Nginx+LVS实现接入层负载均衡,使用Redis缓存热点数据,MySQL分库分表存储。关键设计包括:发布流程先写库后删缓存,查看流程优先读取缓存,点赞/评论异步更新计数。数据库设计采用user_id分库分表,软删除标记和JSON存储优化查询性能。缓存策略通过空值缓存、过期时间打散等方式防护异常,确保系统在亿级用户量下的高可用性和数据一致性。
2026-01-29 19:32:22
1226
原创 Leetcode会员尊享100题:270.最接近的二叉树值
本文介绍了在二叉搜索树中查找最接近目标值的方法。通过递归遍历二叉树,比较节点值与目标值的绝对差,记录最小差值及对应节点值。当存在多个相同最小差值时,返回数值较小的那个。算法使用辅助类Info存储当前最优解,在递归过程中不断更新最近值和最小差值。该方法适用于任意规模的二叉搜索树,能高效处理目标值在树中可能不存在的情况,确保返回最接近的节点值。
2026-01-29 18:37:17
89
原创 Leetcode49:字母异位词分组
Leetcode49:字母异位词分组 摘要:本文介绍了一种将字母异位词分组的方法。通过统计每个单词的字符频率,将相同频率组成的单词归为一组。具体实现使用哈希表存储按字母顺序排序后的字符串作为键,对应的异位词列表作为值。最后返回哈希表中所有值组成的列表。该方法能有效处理各种边界情况,如空字符串或单个字符输入。时间复杂度主要取决于字符串长度和数量,空间复杂度为O(n)。
2026-01-28 20:31:59
465
原创 面试题:说一说redis和Memcached的区别
Memcached和Redis的核心差异在于定位和功能。Memcached是纯内存缓存系统,采用多线程模型,适合简单键值存储但无持久化功能;Redis作为内存数据库,支持丰富数据结构、持久化和集群功能,单线程计算保证复杂操作性能。在简单读写场景下Memcached性能略优,但Redis功能全面且内存效率更高。当前Redis已成为主流选择,仅在最简缓存场景下会考虑Memcached。两者差异主要体现在功能广度而非绝对性能差距。
2026-01-28 20:27:22
1418
原创 Leetcode12:整数转罗马数字
Leetcode12:整数转罗马数字本文介绍了将整数转换为罗马数字的算法规则。罗马数字由7个符号组成,通过特定规则组合表示数值:通常从大到小累加符号,但对4和9采用减法形式(如IV=4,IX=9)。算法使用预定义的符号组合表,按千、百、十、个位分别查询对应表示,最后拼接结果。示例展示了3749转为"MMMDCCXLIX"的过程。代码实现通过二维数组存储各位的罗马数字表示,通过整除和取余运算分解数字各位并查表转换。该算法适用于1-3999范围内的整数转换。
2026-01-26 23:20:37
403
原创 面试题:知道WebSocket协议吗?
WebSocket是一种基于TCP的全双工通信协议,通过HTTP握手升级建立持久连接,实现服务器与客户端之间的低延迟实时数据传输。其核心优势包括:全双工通信、持久连接(减少连接开销)、低帧头开销(最小2字节)和高实时性(毫秒级延迟)。工作原理分为握手阶段(HTTP升级协议)和数据传输阶段(以帧为单位)。与HTTP相比,WebSocket突破了单向请求-响应的限制,适用于即时通讯、实时数据展示等场景。典型实现包含FIN、Opcode等帧结构,支持Ping/Pong心跳检测,可通过SpringBoot的@Ena
2026-01-26 23:02:28
1182
原创 LeetCode热题100: 49.字母异位词分组
LeetCode热题100: 49.字母异位词分组 摘要:本文介绍了如何将字符串数组中的字母异位词分组。字母异位词是指由相同字母重新排列组成的单词。通过统计每个单词的字母频次,并按字母顺序拼接为键值存入哈希表,最终将哈希表的值转换为结果列表。该方法时间复杂度为O(n*k),其中n是字符串数量,k是字符串最大长度。
2026-01-25 17:54:42
349
原创 大厂面试真题-说说kafka消费端幂等性?
摘要:Kafka消费者端的幂等性是指确保消息重复处理时不会产生重复数据或错误结果。实现方法包括:1) 妥善管理消费者位移;2) 设计幂等的消息处理逻辑;3) 使用幂等性标识符;4) 采用事务性处理;5) 完善异常处理机制;6) 进行幂等性测试。示例展示了Java中通过提交偏移量和设计幂等处理逻辑来实现消费者端幂等性的基本方法,但实际应用中还需考虑生产端处理和跨分区事务等更复杂情况。
2026-01-25 17:48:29
325
原创 LeetCode热题100:5.最长回文子串
LeetCode热题100:5.最长回文子串本文介绍了使用Manacher算法查找字符串中最长回文子串的解决方案。该算法通过预处理字符串(插入特殊字符)将奇偶长度回文统一处理,利用回文对称性避免重复计算。核心思想是维护当前最右回文边界和中心点,通过三种情况处理新位置的回文半径计算:完全在边界内、完全在边界外、恰好到达边界。算法时间复杂度为O(n),空间复杂度为O(n)。代码实现了预处理、半径计算和结果转换的全过程,能够高效找到最长回文子串。
2026-01-24 22:29:56
241
原创 说一说Mysql的读写分离
摘要:京东和阿里通过分层架构实现高效读写分离。京东电商场景采用主库+多级从库设计,核心交易读使用低延迟从库,配合缓存和熔断机制保障一致性;大促时弹性扩容从库并启用多级缓存。阿里基于DRDS中间件实现异地多活,根据用户地域路由读请求,对强一致性读特殊处理,并通过多AZ冗余确保高可用。两大厂共性在于:业务导向设计、多层流量拦截、智能延迟治理、自动化运维和弹性扩展能力,形成完整的读写分离体系。(149字)
2026-01-24 22:26:16
576
原创 LeetCode1265:逆序打印不可变链表
LeetCode1265:逆序打印不可变链表本文介绍两种方法逆序打印不可变链表节点值。第一种使用栈结构(空间复杂度O(n)),先将所有节点入栈再依次出栈打印;第二种采用递归(隐式使用调用栈),先递归处理后续节点再打印当前节点。两种方法均满足题目要求,其中递归解法更简洁但需注意栈溢出风险。进阶问题探讨了如何优化空间复杂度,但基本解法已满足常规需求。
2026-01-23 22:13:50
259
原创 Leetcode129:求根节点到叶子节点数字之和
Leetcode129:求根节点到叶子节点数字之和该算法计算二叉树中所有根到叶路径代表的数字之和。采用深度优先搜索递归遍历,每层将当前路径值乘以10加上节点值传递给子节点。当到达叶节点时返回累计值,非叶节点则继续递归左右子树。示例1中路径1->2和1->3分别计算为12+13=25;示例2中路径4->9->5、4->9->1和4->0计算为495+491+40=1026。时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。
2026-01-23 22:11:06
255
原创 设计模式:责任链模式
责任链模式是一种解耦请求发送者和接收者的设计模式,通过将多个处理者串联成链来处理请求。以请假审批为例,部门经理、总监、总经理构成责任链,各自处理权限范围内的申请,无权则传递至下一节点。该模式的核心价值在于解耦、灵活扩展和简化对象关系,适用于Web过滤器、拦截器链等工作流场景。其缺点是可能存在请求无人处理、性能损耗和调试困难的问题。与策略模式不同,责任链强调请求的传递而非选择。通过Java代码示例展示了请假审批流程的实现,体现了请求沿链传递直至被处理的核心逻辑。
2026-01-22 10:04:41
723
原创 设计模式系列:工厂模式
工厂模式是一种创建型设计模式,它将对象创建过程封装在专门的工厂类中,实现创建与使用的分离。核心思想是客户端只需指定所需对象类型,无需关心具体创建逻辑。该模式主要解决三个问题:复杂对象的创建逻辑封装、产品类型的灵活切换、降低客户端与具体产品的耦合度。工厂模式包含抽象产品、具体产品、工厂等核心角色,通过"客户端请求-工厂生产-返回产品"的流程运作。常见变体包括简单工厂、工厂方法和抽象工厂,适用于不同复杂度场景。优点在于解耦和扩展性,但可能增加类数量,适用于数据库访问、日志系统等需要灵活创建对
2026-01-22 09:34:18
1205
原创 面试题:说一下Spring的事务传播特性
Spring事务传播行为定义了方法调用时的事务参与规则,提供7种传播方式:REQUIRED(默认)、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED、MANDATORY、NESTED和NEVER。其中REQUIRED适合大多数业务场景,REQUIRES_NEW用于独立事务,NESTED依赖数据库保存点实现部分回滚。使用时需注意:传播行为需通过代理对象调用才生效,NESTED需要数据库支持保存点功能。不同传播行为适用于不同场景,如日志记录需要REQUIRES_NEW,性能敏感查询适用NE
2026-01-21 17:47:15
1079
原创 Leetcode1027:最长等差数列
Leetcode1027:最长等差数列 本文介绍了一个求解整数数组中最长等差子序列长度的动态规划方法。算法使用二维数组dp[i][j]记录以i结尾、公差为j的子序列长度,其中j通过+500处理避免负数下标。遍历数组时,对于每个元素对计算差值,更新对应dp值并维护全局最大值。该方法时间复杂度为O(n²),空间复杂度为O(n×1001),适用于长度≤10000的数组。示例显示该算法能正确识别[3,6,9,12]全序列等差、[9,4,7,2,10]的最长子序列[4,7,10]等情况。
2026-01-21 17:09:20
210
原创 面试题:说一下一条UPDATE语句的执行过程
本文详细解析了MySQL中UPDATE语句的执行流程,以UPDATE t_user SET name='test' WHERE id=1;为例:1)执行器通过存储引擎定位目标记录;2)判断是否需要更新;3)生成UndoLog并记录RedoLog;4)更新内存记录并写入RedoLogBuffer;5)记录Binlog到缓存;6)采用两阶段提交机制(prepare和commit阶段)确保RedoLog和Binlog一致性;7)完成事务提交。整个过程体现了MySQL的WAL(预写日志)技术,通过先写日志再异步刷盘
2026-01-21 17:06:23
491
原创 面试题:Kafka的零拷贝的底层实现是什么?是MMAP还是sendFile还是其他的?
Kafka差异化使用mmap和sendfile实现高性能I/O:mmap用于本地日志读写,支持随机访问和内存复用;sendfile用于跨节点数据传输,实现内核态零拷贝。两者结合SG-DMA技术消除CPU拷贝,mmap处理灵活读写需求,sendfile优化纯转发场景,共同支撑Kafka的高吞吐特性。技术选型依据场景需求:mmap适配生产消费路径,sendfile专攻副本同步和远程消费。
2026-01-20 20:24:58
737
原创 面试题:sendFile实现零拷贝是用了mmap还是DMA/SG-DMA,还是用了其他的什么技术
sendfile是专为零拷贝设计的系统调用,完全独立于mmap,通过DMA/SG-DMA硬件加速和内核态直接转发实现高效数据传输。其核心优势在于:1)全程无用户态参与,仅1次系统调用;2)内核直接修改页表指针转发数据,避免CPU拷贝;3)与SG-DMA深度结合,支持离散内存页传输。相比mmap方案,sendfile更轻量高效(无内存映射、更少系统调用),但仅适用于静态文件到网络设备的单向传输。该技术被Nginx等广泛应用,是零拷贝领域的核心实现方案。
2026-01-20 20:23:11
417
原创 Leetcode会员专享题:426.将二叉搜索树转换为排序的双向链表
426.将二叉搜索树转换为排序的双向链表 该算法将二叉搜索树就地转换为已排序的双向循环链表。通过中序遍历(DFS)处理节点,维护pre指针记录前驱节点,head指针记录链表头节点。遍历时,将当前节点与前驱节点双向连接,最终将首尾节点相连形成循环链表。时间复杂度O(n),空间复杂度O(h),其中h为树高。关键点在于利用中序遍历特性保持节点有序,并通过指针操作实现原地转换。
2026-01-20 20:12:21
188
原创 Leetcode347:前K个高频元素
Leetcode347:前K个高频元素题目要求找出数组中前k个高频元素。解题思路是:首先统计每个数字出现的频率,然后使用小顶堆(优先队列)维护频率最高的k个元素。具体步骤:1) 用哈希表统计频率;2) 遍历哈希表,将元素按频率存入容量为k的小顶堆,堆满时若当前元素频率大于堆顶则替换;3) 最后堆中元素即为结果。该方法时间复杂度为O(nlogk),优于O(nlogn),满足进阶要求。示例验证了算法的正确性,如输入[1,1,1,2,2,3],k=2时正确输出[1,2]。
2026-01-19 15:53:42
225
原创 面试题:Netty 无锁串行化是怎么设计的?
Netty通过无锁串行化设计实现高性能并发处理,其核心是将每个Channel绑定到特定EventLoop,由单线程串行处理所有事件。这种设计避免了多线程竞争和锁开销,通过事件队列机制保证同一Channel的操作始终在同一线程执行。代码示例展示了NioEventLoopGroup和ChannelPipeline的创建过程,其中每个ChannelHandler都在绑定EventLoop的线程中运行,确保无锁操作。该设计简化了并发编程,显著提升了系统吞吐量和响应性能。
2026-01-19 10:25:13
418
原创 面试题:说说MMAP和DMA/SG-DMA的关系
摘要:MMAP(内存映射)是操作系统提供的虚拟内存机制,通过将文件/外设地址空间直接映射到进程虚拟地址空间,实现高效数据读写。其核心优势在于消除CPU拷贝(传统I/O需2次拷贝)和减少系统调用,通过页表映射实现内核态与用户态内存共享。MMAP采用懒加载机制,首次访问时触发缺页中断加载数据。相比传统I/O,MMAP内存占用减半,尤其适合大文件、高频读写场景。Java通过MappedByteBuffer实现MMAP,需注意内存泄漏风险。MMAP与SG-DMA协同构成零拷贝技术核心,前者解决软件层拷贝,后者处理硬
2026-01-18 21:56:36
738
原创 面试题:说一说什么是DMA、SG-DMA
DMA(直接内存访问)和SG-DMA(分散-聚集DMA)是两种硬件级数据传输机制。传统DMA要求连续物理内存块传输,而SG-DMA通过描述符链表支持非连续内存块传输,显著减少中断次数和CPU开销。SG-DMA更适用于现代操作系统的虚拟内存机制,在网络通信、存储系统等场景性能优势明显。两者核心区别在于内存连续性要求和中断处理方式,SG-DMA作为增强版,已成为高性能I/O设备的基础技术。
2026-01-18 21:18:50
997
原创 Leecode热题100-155.最小栈
Leecode热题100-155.最小栈本文介绍了一种实现最小栈(MinStack)的方法,该数据结构支持常规栈操作(push/pop/top)并能在常数时间内获取当前栈中最小元素。核心思路是使用两个栈:一个普通栈存储实际数据,另一个辅助栈动态维护当前最小值。当压入新元素时,若该元素小于等于辅助栈顶元素则同时压入辅助栈;弹出元素时,若与辅助栈顶元素相等则同时弹出。这样辅助栈顶始终保持当前最小值,getMin()操作只需O(1)时间。该方法通过空间换时间,保证了所有操作的时间复杂度均为常数级。
2026-01-18 15:13:44
662
原创 Leetcode尊享面试100题:252. 会议室
Leetcode尊享面试100题:252. 会议室判断能否参加所有会议的问题可以通过排序会议时间来解决。首先将会议按开始时间排序,若开始时间相同则按结束时间排序。然后检查是否存在后一个会议的开始时间早于前一个会议的结束时间,若有则返回false,否则返回true。该方法时间复杂度为O(nlogn),空间复杂度为O(1)。
2026-01-15 21:54:15
376
原创 Leetcode尊享面试100题:1060. 有序数组中的缺失元素
Leetcode尊享面试100题:1060. 有序数组中的缺失元本文提出了两种解决有序数组中查找第k个缺失数字的方法。基础解法通过遍历数组计算相邻元素间的缺失数,时间复杂度O(n);进阶解法使用二分查找优化至O(logn),通过计算区间缺失数定位目标位置。代码实现包含两种方法:missingElement2()采用线性扫描,missingElement()利用二分查找快速定位。示例显示两种方法均能正确找出缺失数字,如输入[4,7,9,10]和k=3时输出8。提示指出数组长度可达5万,要求高效处理大规模数据。
2026-01-15 21:45:31
299
原创 面试题:Order by是通过什么实现的,为什么有的时候会耗时比较长但是最终能返回正确结果,怎么改善?
MySQL中ORDER BY的性能差异主要取决于是否使用索引排序。索引排序(Using index)直接利用有序索引结构高效返回结果,而文件排序(Using filesort)则需内存/磁盘排序操作,导致性能下降但结果仍正确。优化关键包括:1)建立匹配ORDER BY条件的索引(单列/复合/覆盖索引);2)通过WHERE条件减少排序数据量;3)合理设置sort_buffer_size参数;4)避免对排列表达式使用函数。核心思路是优先利用索引避免文件排序,其次控制排序数据规模。
2026-01-14 17:13:15
1060
原创 面试题:解释一下什么是全字段排序和rowid排序
MySQL执行filesort时有两种核心算法:全字段排序和rowid排序。全字段排序将所有查询字段加载到sort_buffer,排序后直接返回结果,无需回表但内存占用大;rowid排序仅加载排序键和主键,排序后需回表但内存占用小。MySQL 5.6+默认优先使用rowid排序,因其更适合处理大数据量场景。两种算法通过max_length_for_sort_data参数控制切换,但最佳优化方案仍是建立合适的覆盖索引来避免filesort。核心差异在于内存占用与回表开销的权衡,实际应用中应优先考虑索引优化。
2026-01-14 16:58:05
885
原创 怎么排查线上CPU100%的问题
摘要:本文提供了两种排查Java应用CPU占用过高的方案。方案一基于JDK原生工具,通过top定位进程、线程转16进制后结合jstack分析线程栈,辅以jstat监控GC情况。方案二使用Arthas工具,提供可视化分析,支持直接输出高CPU线程和生成火焰图。两种方案均遵循"定位进程→定位线程→分析代码→优化问题"的流程,前者适合无外网环境,后者对新手更友好。常见问题包括死循环、内存泄漏、锁竞争和低效算法,需针对性优化。
2026-01-13 21:50:02
1260
原创 JMM 三大特性(原子性 / 可见性 / 有序性)面试精简版
摘要:Java内存模型(JMM)定义了多线程共享变量的访问规则,通过原子性、可见性和有序性三大特性保障并发安全。原子性通过synchronized、Lock和CAS机制确保操作不可分割;可见性借助volatile、synchronized强制内存同步,解决工作内存与主内存不一致问题;有序性则通过内存屏障和happen-before原则防止指令重排。特别强调volatile不能保证原子性,DCL单例模式必须使用volatile,而synchronized是全能型解决方案。理解这些特性及对应实现机制,是解决多线
2026-01-13 11:23:12
629
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅