自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 速通Hot100-Day12——搜索二叉树

本文展示了4个关于二叉搜索树(BST)的算法题解,均采用中序遍历实现。98题验证BST,通过比较当前节点与前驱节点的值;783和530题求最小节点差,利用BST有序特性计算相邻节点差值;501题寻找众数,统计连续相同值的出现次数。这些解法都利用了BST中序遍历的有序特性,通过维护前驱节点(pre)实现高效遍历,时间复杂度均为O(n)。核心思路相似,区别在于具体比较逻辑和结果处理方式。

2026-04-02 10:02:35 44

原创 速通Hot100-Day11——二叉树

本文介绍了二叉树相关的几个算法问题及解法:1. 从中序与后序遍历序列构造二叉树:通过后序数组确定根节点,在中序数组中找到分割点,递归构建左右子树。2. 构建最大二叉树:在数组中找到最大值作为根节点,递归处理左右子数组。3. 合并二叉树:同步遍历两棵树,合并对应节点值,优先保留非空子树。4. 二叉搜索树搜索:使用层序遍历查找目标值节点。这些解法都利用了递归或迭代的遍历方式,通过合理处理节点关系实现相应功能。

2026-04-01 10:35:57 52

原创 安装 OpenClaw & 接入飞书

本文介绍了OpenClaw AI助手的安装配置及接入飞书的完整流程。安装需Node.js 22+环境,通过PowerShell执行脚本完成部署。配置过程包括选择Qwen免费模型(支持OAuth授权)、安装基础技能包和启动网关服务。飞书接入部分详细说明了应用创建、权限配置、事件订阅和私聊配对步骤,并提供了消息交互和技能管理功能。整个过程包含多个关键命令和配置选择,适合新手快速上手体验AI助手的基本功能,同时也为后续进阶使用(如更换付费模型、扩展技能)奠定了基础。

2026-03-27 20:19:24 559

原创 速通Hot100-Day10——二叉树

本文总结了多个二叉树相关算法题的解法:1. 计算完全二叉树节点数采用递归方式;2. 判断平衡二叉树需比较子树高度差;3. 获取所有路径使用DFS递归;4. 路径总和问题采用BFS队列解法;5. 左叶子之和有两种判断方式(父节点角度或当前节点角度);6. 找树左下角的值可通过调整节点入队顺序或判断层序首节点实现。各解法均包含详细的代码实现,展示了二叉树问题的常见解决思路。

2026-03-23 15:55:57 50

原创 速通Hot100-Day09——二叉树

本文提供了二叉树常见遍历和操作的Java实现代码,包括:1.三种深度优先遍历(前序、中序、后序)的递归实现;2.层序遍历的两种实现方式(数组和队列);3.二叉树翻转的递归和迭代实现;4.对称二叉树判断;5.计算二叉树最大深度和最小深度的递归与迭代方法。这些实现均基于TreeNode类定义,展示了二叉树基本操作的核心思路,包括递归处理子树、队列辅助的广度优先搜索等技巧。

2026-03-22 16:12:19 259

原创 速通Hot100-Day07——栈

本文分析了三种栈和队列的实现问题: 用栈实现队列:使用两个栈(stIn和stOut)模拟队列,push和empty操作O(1),pop和peek均摊O(1)。关键思想是当stOut为空时将stIn元素全部转移到stOut。 用队列实现栈:使用一个队列即可模拟栈,push操作O(n)(需要循环移动元素),其他操作O(1)。注意top操作需要将最后元素重新入队。 有效括号:使用栈结构匹配括号,时间复杂度O(n)。需注意边界条件处理,如栈空时遇到右括号或遍历结束后栈非空都视为无效。 三种问题都利用了数据结构特性转

2026-03-14 11:07:37 239

原创 速通Hot100-Day06——字符串

String 不可变,所以需要重新定义一个 char 数组,当然从头开始可以使用 StringBuilder。【推导结论】如果一个字符串是由重复子串构成的,那么最小的重复单元 => 字符串 - 最长前后缀相等的部分。如果字符串长度 / (字符串长度 - 整个字符串最长前后缀长度) == 0,那么就可以重复子串构成。就是经典的 KMP,需要去学习 KMP。替换长度而已,从最后下标开始遍历替换。【分析】时间(n),空间O(n)上一天的 动态口令,题目一模一样。

2026-03-13 10:27:50 50

原创 速通Hot100-Day05——字符串

本文总结了四个字符串处理问题的解法:1)344题通过双指针原地反转字符数组;2)541题按照2k间隔翻转前k个字符;3)LCR122题简单替换路径中的点;4)LCR182题通过字符串分割或手动拼接实现动态口令。所有解法均保持O(n)时间复杂度和O(1)空间复杂度,强调避免直接使用库函数,注重算法核心思想的实现。

2026-03-11 16:47:06 42

原创 速通Hot100-Day04——哈希

本文分析了多个数组求和问题的解法。454题通过哈希表存储两数之和,将四数之和转化为查找相反数,时间复杂度O(n²)。383题使用数组统计字符频率判断字符串包含关系。15题三数之和采用排序+双指针法,注意去重。18题四数之和在双循环基础上加入剪枝优化,同样利用双指针法。这些解法都体现了将复杂问题分解为子问题的思路,并通过哈希表或双指针优化时间复杂度,其中排序和去重是关键步骤。

2026-03-10 11:21:48 300

原创 速通Hot100-Day01——数组

本文展示了五个常见的数组处理算法实现:1)二分查找,通过左右指针定位目标值;2)移除指定元素,使用双指针原地修改数组;3)有序数组平方排序,采用双指针从两端比较填充新数组;4)寻找满足条件的最短连续子数组,滑动窗口动态调整边界;5)生成螺旋矩阵,通过控制循环层数和偏移量顺时针填充数字。这些算法均采用双指针技术,时间复杂度在O(n)到O(logn)之间,体现了高效处理数组问题的典型方法。

2026-03-09 20:45:49 36

原创 速通Hot100-Day03——哈希

本文展示了几个使用哈希表解决问题的算法实现:1. 字母异位词判断(242题)通过字符计数数组比较;2. 数组交集查找(349题)使用哈希表或集合实现;3. 快乐数判断(202题)利用集合检测循环;4. 两数之和问题(1题)分别给出哈希表和双指针解法。这些案例演示了哈希表在统计、去重和快速查找中的典型应用,同时对比了不同解法的时间/空间复杂度。

2026-03-09 11:32:21 32

原创 速通Hot100-Day02——链表

本文展示了多个链表相关算法题的Java实现方案。主要内容包括:1) 203题移除指定值节点,通过虚拟节点简化操作;2) 707题设计链表数据结构,实现增删查功能;3) 206题反转链表,提供迭代和递归两种解法;4) 24题两两交换节点;5) 19题删除倒数第N个节点;6) 面试题02.07判断链表相交;7) 142题检测环形链表入口。这些解法涵盖了链表的基本操作技巧,如虚拟节点、双指针、递归等,展示了处理链表问题的常见模式和方法。

2026-03-08 15:47:34 26

原创 git clone xxx.git 的公钥和私钥配置

本文介绍了使用SSH密钥对进行Git克隆的方法。通过生成公钥(id_rsa.pub)和私钥,将公钥配置到GitHub/GitLab平台,即可通过SSH协议自由克隆仓库,相比HTTPS方式更安全便捷。文章简要说明了密钥对的存放位置(~/.ssh)及配置流程,帮助开发者实现"Git自由"。

2025-12-09 00:58:42 436

原创 公司中私有依赖

摘要:对于公司内部维护的Maven依赖管理,新人只需替换setting.xml文件即可快速配置开发环境。文中提供了标准的Nexus私服配置模板,包含服务器账号信息和仓库地址设置。通过使用公司统一的配置文件,开发者无需自行维护依赖,可直接获取包括Hutool、Redis等在内的所有公司内部工具包。配置文件中详细定义了仓库URL、更新策略等参数,确保开发环境快速搭建。不同公司可能采用不同的依赖管理工具,但都会提供相应的账号权限。

2025-12-09 00:47:56 188

原创 Hot100——多维动态规划

该题解使用中心扩散算法结合动态规划思想求解最长回文子串。算法通过以每个字符为中心向左右扩散,同时处理奇偶两种情况。关键点包括:1)当字符重复时继续扩散;2)左右字符相等时扩大范围;3)记录最大长度和起始位置。注意left指针会停在真实回文子串的左侧,因此最终截取子串时需要用start+1作为起始位置。时间复杂度为O(n^2),空间复杂度O(1)。

2025-10-17 11:58:43 149

原创 Hot100——栈系列

该文解析了字符串解码问题的解法,重点处理嵌套括号情况。使用双栈分别存储数字和字符串,当遇到'['时暂存当前结果,遇到']'时拼接重复字符串。时间复杂度O(n),空间复杂度O(n)。核心思想是:遇到数字累积计数,遇到'['压栈当前结果,遇到']'弹出栈顶元素进行字符串拼接。示例展示了如何解码类似"2[a3[cd]]"的嵌套字符串。该解法清晰高效地处理了嵌套结构的字符串解码问题。

2025-10-17 11:57:06 168

原创 Mac系统,Docker的MySQL + 本地 Canal

MacOS 系统,Docker 安装 mysql + 本地安装 canal。如何正确和无痛安装 canal

2025-09-25 20:10:27 1137

原创 BeanUtils.copyProperties 映射规则详解

只能处理字段名完全相同的属性映射对于字段名不匹配的情况,必须手动设置在生产环境中,建议添加空值检查和异常处理考虑使用 MapStruct 等更强大的映射工具来替代 BeanUtils。

2025-09-21 18:52:13 537

原创 ES——(四)Java操作ES示例以及原理

本文介绍了Spring Boot集成Elasticsearch的环境搭建与基本操作。首先通过pom.xml引入Spring Data Elasticsearch依赖,并配置排除数据源自动配置。接着创建Person实体类映射索引库,使用@Document和@Field注解定义索引结构。通过继承CrudRepository实现基本CRUD操作,包括保存数据、查询所有文档和条件查询(如模糊查询和多条件查询)。对于复杂查询,展示了使用ElasticsearchClient构建DSL语句的两种方式。

2025-09-14 10:18:59 1537

原创 ES——(三)DSL高级查询

摘要:本文介绍了Elasticsearch的DSL查询语法,包含多种查询方式和聚合分析功能。主要内容包括:1) 基础查询如match_all、match、multi_match;2) 精确查询term和terms;3) 范围查询range;4) 组合查询bool(must/should/must_not/filter);5) 聚合查询(指标聚合和桶聚合);6) 其他功能如分页、排序、高亮显示。通过示例演示了如何创建索引、添加文档,并针对商品数据进行各类查询操作,特别说明了filter查询不计算得分但效率更高

2025-09-13 21:25:11 873

原创 ES——(二)基本语法

nested:类型是一种特殊的对象object数据类型(specialised version of the object datatype ),允许对象数组彼此独立地进行索引和查询。demo: 建立一个普通的my_comment_index索引如上所示,所以我们有一个文档描述了一个帖子和一个包含帖子上所有评论的内部对象评论。但是Elasticsearch搜索中的内部对象并不像我们期望的那样工作。"title": "狂人日记",

2025-09-13 21:23:16 1248

原创 ES——(一)基本概念

Elasticsearch 8.5.3 是一个基于 Lucene 的分布式搜索服务器,具有实时搜索、高可用性和 RESTful API 等特性。它支持结构化数据和非结构化数据的全文检索,通过倒排索引实现高效查询。Elasticsearch 可用于独立数据库、搜索系统、日志系统和大数据分析等场景。文档介绍了核心概念如索引、类型、文档和映射,以及基本操作如索引管理、文档增删改查和映射配置。重点讲解了动态映射、静态映射和 nested 类型的使用,以及如何安装 IK 分词器。Elasticsearch 8.x 版

2025-09-13 21:21:03 1246

原创 功能篇——过期删除和内存淘汰

Redis通过过期删除策略和内存淘汰策略管理内存使用。过期删除策略采用惰性删除(访问时检查过期)和定期删除(随机抽查20个key)相结合的方式。内存淘汰策略在内存不足时触发,包括8种策略,分为不淘汰数据和淘汰数据两类。淘汰策略又细分为在过期数据中淘汰(如volatile-lru)和全局淘汰(如allkeys-lru)。Redis4.0引入LFU算法解决LRU的缓存污染问题,通过记录访问频率而非次数来更精准淘汰数据。这些策略共同确保Redis在性能和内存使用间取得平衡。

2025-09-12 21:28:39 800

转载 LambdaQueryWrapper 和 QueryWrapper 区别

需要注意的是,在某些特殊情况下,特别是涉及到复杂的查询逻辑、关联表查询等高级查询需求时,QueryWrapper 的灵活性会更加适用。而在普通的单表查询中,LambdaQueryWrapper 的简洁性和类型安全性更加优势。LambdaQueryWrapper:使用 Lambda 表达式构建查询条件,可以通过实体类的属性和方法来安全地编写查询条件,减少犯错和代码冗余。QueryWrapper:由于是字符串形式的条件拼接,编译时无法检查其中的错误和类型不匹配问题,所以需要开发人员自行保证查询条件的正确性。

2025-09-09 09:05:42 137

原创 SQL 层面行转列

背景:如果对一些评论、点赞、收藏等互动数据,使用了按照 type 分类存储,num 也是对应的。这样如果创建一个帖子,那么就会出现 3 行数据(type 不同,num 不同,对应评论点赞和收藏),那如果我返回给前端,只想返回一行。即 3 行数据转化为 3 列属性(评论、点赞、收藏)。本文就是一个项目中的一个举例,不再单独举例子。这里只关注了 sql编写,到 mapper 中怎么写,关于中间接口的定义,就不再赘述。

2025-09-08 11:32:57 398

原创 四、垃圾回收(四)—— 垃圾回收器

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。STW:(stop the world):全世界都停止了。用户线程:在一段时间,用户线程不能执行用户程序。不管哪种回收器进行垃圾回收时,用户线程都会有暂停。都会出现stw.好点的垃圾回收器:stw时间会短。不好的垃圾回收器:stw时间会更长。所以就是看谁的,STW 时间更短。在讲解垃圾回收器之前先了解一下串行、并行、并发,按照类型来答题,这样就分的很清楚了。串行:一个GC线程运行。3个。

2025-09-08 11:24:20 1232

原创 四、垃圾回收(三)—— 垃圾回收算法

JVM垃圾回收算法摘要:垃圾回收涉及三种基本算法:标记清除(简单但产生碎片)、标记复制(高效但浪费内存)、标记整理(解决碎片但效率低)。各算法均有优缺点,因此JVM采用分代收集策略:新生代(存活率低)使用复制算法,老年代(存活率高)采用标记清除或标记整理的混合方式。核心挑战在于平衡STW时间与系统性能,通过分代策略实现高吞吐和低停顿。没有最优算法,只有最适合场景的解决方案。

2025-09-04 11:08:55 1046

原创 七、线程池

Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,ExecutorService,ThreadPoolExecutor这几个类。Executor接口是顶层接口,只有一个方法,过于简单。通常不使用它,而是使用ExecutorService接口:通常使用Executors工具类创建线程池。【面试题】execute和submit的区别而submit是ExecutorService的方法,并且ExecutorService接口继承了Executor接口。而submit可以接受Run

2025-09-01 21:05:24 989

原创 四、GC 垃圾回收(二)

文章摘要: Java垃圾回收主要基于可达性分析算法,判断对象是否被GC Roots引用链可达。对象回收前会经历finalize()标记过程,该方法允许对象复活但只能调用一次。引用类型分为强引用(不回收)、软引用(OOM前回收)、弱引用(下次GC回收)和虚引用(随时回收)。引用计数法因循环引用问题未被Java采用。可达性分析需要Stop-The-World保证一致性,通过虚拟机栈、方法区等确定GC Roots。finalize机制为对象提供复活机会,但执行时机不可控,应避免主动调用。

2025-08-30 11:38:52 1289

原创 四、GC 垃圾回收(一)

JVM内存模型分为堆、方法区、虚拟机栈等区域。堆内存包括新生代(Eden、Survivor区)和老年代。MinorGC主要清理新生代,FullGC清理整个堆。GC机制通过引用计数和可达性分析判断垃圾对象,采用复制、标记清除等算法回收内存。方法区的类卸载条件苛刻,需满足实例对象、Class对象和类加载器均无引用时才发生,且系统类永不卸载。相比频繁的对象回收,类卸载是罕见事件,主要发生在自定义类加载器场景。

2025-08-30 11:29:07 798

原创 六、阻塞队列

摘要: BlockingQueue是Java并发包中用于多线程数据安全传输的接口,主要解决生产者-消费者模式中的线程协调问题。它提供四种处理方式:抛出异常、返回特殊值、阻塞和超时等待。核心实现类包括ArrayBlockingQueue(数组有界)、LinkedBlockingQueue(链表可选有界)和SynchronousQueue(直接交付)。

2025-08-30 09:40:05 1363

原创 五、Callable 接口

摘要:Java创建线程主要有5种方式:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池和CompletableFuture。Callable与Runnable的关键区别在于:Callable的call()方法可返回结果和抛出异常,而Runnable的run()方法无返回值且异常需内部处理。通过FutureTask包装Callable可解决Thread类不直接接收Callable的问题,利用FutureTask的get()方法可获取异步执行结果,但会阻塞主线程。

2025-08-29 20:42:52 491

原创 四、JUC 辅助类

本文介绍了Java多线程编程中的三个重要同步工具类:CountDownLatch、CyclicBarrier和Semaphore。CountDownLatch是一个倒计数器,用于等待一组线程完成操作后再执行主线程;CyclicBarrier是一个循环栅栏,允许多个线程在某个屏障点同步等待;Semaphore是信号量,用于控制同时访问资源的线程数量。文章详细说明了每个类的使用方法、核心API和典型应用场景,并通过代码示例演示了它们的具体实现。最后对比了CountDownLatch与join方法的区别,以及Cy

2025-08-28 10:09:27 645

原创 一、JUC 基本概念

本文介绍了Java并发编程中的核心概念和工具。主要内容包括:1)JUC包的概述,提供了并发编程的实用工具类;2)进程和线程的区别与联系,线程作为更轻量级的执行单元;3)并发与并行的概念区分,以及同步与异步的工作方式;4)线程的6种状态及其转换;5)创建线程的多种方式(继承Thread类、实现Runnable接口、使用Callable和FutureTask等);6)Synchronized关键字的使用,包括方法同步和代码块同步的不同实现方式。文章通过生活实例和代码示例,帮助理解这些并发编程的基础知识。

2025-08-27 09:41:11 802

原创 二、JVM 入门 —— (四)堆以及 GC

本文介绍了JVM堆内存的核心概念及其运行机制。堆是JVM中最大的线程共享内存空间,采用分代结构:新生代(Eden+S0+S1)和老年代。对象创建主要在Eden区,通过MinorGC在新生代间复制转移,当年龄计数器达15时晋升老年代。老年代空间不足会触发FullGC。与永久代不同,JDK1.8的元空间使用本地内存,减少了GC频率。文章还详细说明了各类GC的触发条件及优化建议,强调应避免频繁FullGC以提升性能。

2025-08-26 21:54:18 1611

原创 二、JVM 入门——(三)栈

本文介绍了Java栈内存的概念与特性。栈是线程私有的内存区域,生命周期与线程一致,不存在垃圾回收。栈遵循先进后出原则,存储栈帧(包含局部变量表、操作数栈等)。方法调用时生成栈帧入栈,执行完毕出栈。栈空间大小可调(默认1MB),递归调用可能导致StackOverflowError。通过字节码分析可见局部变量表存储方法参数和变量,操作数栈记录计算过程,动态连接实现方法调用。栈溢出可通过-Xss参数调整栈大小避免。

2025-08-26 21:50:47 1060

原创 02 数据结构—— 单调栈

总结规律:从考虑有些元素是没必要存进栈里的角度出发● 求左边最近最小,那么从左往右遍历,那么后边比前面栈顶的好,就没必要存● 求右边最近最大,那么从右往左遍历,那么前边比后面栈顶的好,就没必要存也就是说,看怎么能利用这个角度去解题。如果是这样的话:○ 求左边最近最大,从左到右○ 求右边最近最小,从右到左遍历简化:○ 求左边的,从左往右遍历○ 求右边的,从右往左遍历都是为了适应:没必要存进栈里这一点。

2025-08-26 09:12:39 434

原创 五、MySQL 架构设计

本文主要探讨数据库分库分表架构设计,包括水平和垂直拆分策略。重点分析了两种实现方式:程序代码封装(如ShardingSphere-JDBC)和中间件封装(如ShardingSphere-Proxy)。详细介绍了MySQL主从同步原理,包括binlog三种格式:STATEMENT记录SQL命令、ROW记录修改后数据、Mixed混合模式。通过实例说明不同binlog格式对数据一致性的影响,Mixed模式能自动选择最优方式确保主从数据同步。

2025-08-24 09:58:54 846

原创 三、线程间通信

本文介绍了Java多线程通信的核心机制。主要内容包括:1)生产者-消费者模型的基础实现,使用synchronized的wait/notify机制;2)解决虚假唤醒问题,将if判断改为while循环;3)Lock与Condition的对应实现,展示更精细的线程控制;4)定制化通信案例,实现线程顺序执行(AA→BB→CC)和数字字母交替打印。关键点在于:资源类高内聚、判断-干活-通知的编程模板、防止虚假唤醒的while循环,以及Lock+Condition的精准线程唤醒机制。

2025-08-24 09:32:08 1230

原创 二、JVM 入门—— (二)方法区

方法区是JVM中存储类信息、常量、静态变量等数据的逻辑区域,具有线程共享、动态调整空间等特点。它存储类型信息(类名、修饰符等)、方法信息、静态变量及即时编译代码。JDK演进中,1.7将字符串常量池移至堆,1.8用元空间替代永久代并移出JVM运行时区。方法区大小影响系统可加载类数量,溢出会抛出PermGen或Metaspace的OOM错误。

2025-08-23 16:54:05 404

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除