- 博客(74)
- 收藏
- 关注
原创 右旋字符串(字符串算法题)1
摘要:题目要求实现字符串右旋转操作,即将尾部k个字符移到前面。解法采用三次原地反转:先整体反转字符串,再分别反转前k个字符和剩余字符。这种方法避免了额外空间使用,时间复杂度O(n)。例如"abcdefg"右旋2位变为"fgabcde"。代码通过字符数组操作实现,关键步骤是定义反转函数来交换指定范围内的字符。Java实现需注意字符串不可变性,需转为字符数组操作。
2025-08-30 16:49:35
27
原创 MyBatisPlus(入门到精通)
MyBatisPlus是一个MyBatis的增强工具,在保持MyBatis核心功能的基础上进行扩展,旨在简化开发、提高效率。它提供了丰富的功能:CRUD操作、条件构造器、分页查询、ActiveRecord模式、插件机制(分页/乐观锁/防全表删除)、逻辑删除、自动填充、SQL注入器等。通过注解如@TableName、@TableId等实现灵活的ORM映射,支持代码生成器自动生成实体类、Mapper等文件。MyBatisPlus与SpringBoot无缝集成,通过配置即可快速实现数据库操作,显著提升开发效率。
2025-08-30 16:02:11
179
原创 Lombok(简化Java当中的开发)
Lombok是一款简化Java开发的工具,通过注解自动生成常见样板代码(如getter/setter、构造方法、日志等)。核心功能包括:1)@Data组合注解替代多个基础注解;2)@Builder支持链式编程;3)@Log自动生成日志对象;4)@Cleanup自动资源管理;5)@SneakyThrows异常处理。安装方式分IDEA版本差异,需添加Maven依赖。Lombok显著减少冗余代码,提升开发效率,支持权限控制(@Getter(AccessLevel.PRIVATE))和属性排除(exclude/of
2025-08-30 10:54:40
369
原创 Spring Boot
本文介绍了SpringBoot框架的核心概念、功能特性及开发实践。主要内容包括: SpringBoot基础 简化了Spring的繁琐配置 采用约定大于配置思想 提供自动配置和起步依赖功能 支持多种项目构建方式 核心功能 简化Web开发,支持Servlet/Filter/Listener注册 提供Thymeleaf模板引擎 整合MyBatis等持久层框架 支持热部署、定时任务等 高级特性 内容协商机制 国际化支持 参数校验 指标监控(Actuator) 日志管理(Logback) 项目部署 多环境配置 Doc
2025-08-29 21:42:23
711
原创 151.翻转字符串里的单词(字符串算法)
文章摘要 本题要求反转字符串中的单词顺序,同时处理多余空格问题。主要思路分为三步:1.去除多余空格;2.反转整个字符串;3.反转每个单词。解法一直接在原字符串上操作,空间复杂度为O(1);解法二通过新建字符数组实现,时间复杂度O(n)。核心难点在于不借助辅助空间的情况下完成操作,通过多次反转巧妙地解决了问题。示例展示了从"the sky is blue"到"blue is sky the"的转换过程。代码提供了两种实现方式,并详细解释了处理边界条件和空格问题的逻辑。
2025-08-29 15:49:15
417
原创 替换数字(字符串算法)
摘要:题目要求将字符串中的数字替换为"number",保留字母不变。最优解法采用双指针法,先计算扩展后的长度,再从后向前填充字符,避免O(n^2)时间复杂度的移动操作。时间复杂度为O(n),空间复杂度为O(n)。Java实现通过预扩数组和逆向操作实现高效替换,而Python/StringBuilder等则需辅助空间。两种方法的时间/空间复杂度均为线性,但双指针法更节省空间。
2025-08-28 20:25:07
578
原创 541. 反转字符串II(字符串算法题)
题目要求对字符串s按特定规则反转:每2k个字符为一组,反转前k个字符,剩余部分保持原样。解法采用双指针法,通过跳跃式遍历(每次移动2k位)和条件判断确定反转区间,高效完成字符反转。关键点在于利用Math.min控制边界,避免数组越界。该方法时间复杂度为O(n),空间复杂度为O(n)(需转为字符数组)。示例验证如输入"abcdefg"(k=2)输出"bacdfeg",符合预期。
2025-08-27 16:06:11
659
原创 344.反转字符串(字符串算法题)
题目要求原地反转字符数组,使用双指针法实现。定义左右指针分别从数组首尾向中间移动,交换对应位置的字符,直到指针相遇。该方法时间复杂度O(n),空间复杂度O(1)。示例代码展示了两种实现方式:for循环和while循环版本,均通过临时变量完成字符交换。注意不需处理中间字符的情况(当i<j时)。该解法避免了使用库函数,体现了算法核心思想。
2025-08-27 10:07:41
630
原创 Git工具
本文介绍了Git的基本概念、核心功能及操作流程。主要内容包括:1. Git概述:Git是分布式版本控制系统,用于代码托管和版本管理,支持分支操作和多人协作。2. 基本操作:包括初始化仓库、文件状态管理、提交修改、版本回退等核心命令。3. 远程协作:配置远程仓库、推送/拉取代码、解决冲突的方法。4. 分支管理:创建、合并、删除分支的操作及冲突处理。5. 标签管理:创建、查看、推送和删除标签的操作。6. Git工作流:介绍GitFlow分支模型规范。7. 开发工具集成:在IDEA中使用Git的配置和操作流程。文
2025-08-26 22:43:49
315
原创 哈希表总结篇
本文系统介绍了哈希表的理论基础及其应用场景。首先阐述了哈希函数和哈希碰撞(拉链法和线性探测法)的处理方式,详细分析了数组、集合(set)和映射(map)三种哈希结构的底层实现及适用条件。通过多个经典题目(如字母异位词、两数之和、快乐数等)对比了不同结构的优劣:数组适合有限字符集场景;set处理大范围离散值;map用于需要记录键值对的场景。特别强调map虽通用但非最优选择,应根据具体需求选择数据结构,如处理重复问题时双指针法往往优于哈希法。最后总结了哈希表的完整知识体系,帮助开发者高效选择合适的数据结构。
2025-08-26 11:38:09
796
原创 第18题:四数之和(哈希算法)
本文介绍了力扣第18题"四数之和"的解法。题目要求在数组中找出所有不重复的四元组使其和等于目标值。解法采用排序+双指针策略:首先对数组排序,然后通过两层循环固定前两个数,再使用双指针寻找后两个数。关键点包括剪枝优化(注意处理负数情况)、去重处理(跳过重复元素)以及防止整数溢出。时间复杂度为O(n³),相比暴力解法的O(n⁴)更高效。文章还对比了类似的三数之和问题,并提供了完整的Java实现代码。
2025-08-26 11:30:22
721
原创 Linux(从入门到精通)
本文系统性地介绍了Linux操作系统的核心知识,包括系统基础、用户管理、文件操作、软件安装、网络配置和安全防护等内容。主要涵盖以下重点: 系统基础:Linux发展历史、目录结构、权限管理、路径概念和常用命令(如ls、cd、mkdir等)。 用户管理:用户/组管理命令(useradd、groupadd)、权限设置(chmod、chown)和超级用户权限(sudo)。 文件操作:文件编辑工具(vi/vim)、内容查看命令(cat、more、tail)、打包压缩(tar)和搜索(grep、find)。 系统管理:
2025-08-25 22:35:30
4822
2
原创 第15题. 三数之和(哈希算法)
本文介绍了力扣"三数之和"问题的解决方案。题目要求在数组中找出所有不重复的三元组,使其和为0。最优解法是双指针法:首先对数组排序,然后固定一个元素,使用双指针在剩余部分寻找满足条件的组合。关键点在于正确处理重复元素,包括固定元素a的去重(与前一个比较而非后一个),以及找到有效组合后对左右指针的去重。该算法时间复杂度为O(n²),相比哈希法更高效且避免了复杂的去重操作。文章还通过具体示例解释了为什么要在找到有效组合后才进行去重处理。
2025-08-25 21:09:38
553
原创 383. 赎金信(链表算法)
题目要求判断赎金信字符串能否由杂志字符串中的字符构成。解决思路:1. 暴力解法:遍历杂志字符,逐个匹配并删除赎金信中的字符,时间复杂度O(n^2)。2. 哈希解法(推荐):利用数组统计杂志字符出现次数,再验证赎金信字符是否足够。关键点:- 杂志字符不可重复使用- 只含小写字母- 哈希数组比map更高效时间复杂度O(n),空间复杂度O(1)(固定26长度数组)。
2025-08-25 12:16:16
490
原创 第454题.四数相加II
摘要: 题目要求计算四个整数数组中满足A[i]+B[j]+C[k]+D[l]=0的元组数量。核心思路是通过哈希表分治处理:先统计前两个数组元素和及其频次,再遍历后两个数组时,查找互补和(0-(c+d))在哈希表中的出现次数并累加。该方法将O(n^4)暴力解优化为O(n^2)时间复杂度,避免重复计算。例如,输入A=[1,2], B=[-2,-1], C=[-1,2], D=[0,2]时,输出2。代码使用HashMap存储中间和,最终返回符合条件的元组总数。
2025-08-15 23:59:22
374
原创 1. 两数之和
【摘要】本文介绍了力扣"两数之和"问题的解法。题目要求在整数数组中找到和为给定目标值的两个数,返回其下标。暴力解法使用两层循环,时间复杂度为O(n²)。更优解法采用哈希表(HashMap),通过存储已访问元素及其下标,在遍历时检查目标补数是否存在,将时间复杂度降至O(n)。文中详细分析了哈希表的选择原因(相比数组和Set更合适)、key-value的含义(key存元素值,value存下标),并提供了两种哈希表实现代码及暴力解法代码,强调哈希法在快速查找元素时的优势。
2025-08-15 19:42:33
841
原创 SpringMVC(详细版从入门到精通)
文章摘要: 本文系统介绍了SpringMVC框架的核心概念与应用,包括MVC设计模式、SpringMVC的执行流程、参数封装、异常处理、拦截器机制以及SSM整合开发。重点讲解了控制器注解(@Controller、@RequestMapping)、RESTful风格实现、文件上传(单文件/多文件/跨服务器)、跨域请求处理(@CrossOrigin)等关键技术。通过学生管理系统的完整案例,演示了如何整合Spring+MyBatis+SpringMVC实现数据增删改查,涵盖IOC容器配置、事务管理、视图解析器和J
2025-08-14 17:05:02
947
原创 349. 两个数组的交集
题目要求计算两个数组的交集,输出唯一元素且不考虑顺序。有两种解法:1.暴力法使用两个固定大小的数组记录数字出现次数,时间复杂度O(m+n),空间复杂度O(1);2.哈希法使用HashSet存储元素,利用集合去重特性,时间复杂度O(m+n),空间复杂度O(m+k)。哈希法更优,尤其当数值范围大时避免空间浪费。关键点在于理解HashSet高效查找和去重的特性,以及根据题目特点选择合适的数据结构。
2025-08-14 10:48:49
614
原创 242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。为了方便举例,判断一下字符串s= "aee", t = "eae"。
2025-08-13 15:18:25
529
原创 哈希表理论基础#哈希表
摘要:哈希表是一种通过关键码直接访问数据的数据结构,本质是数组。它通过哈希函数将数据映射到索引位置,实现O(1)时间复杂度的快速查询。文中介绍了哈希碰撞的两种解决方法(拉链法和线性探测法)及适用场景,并对比了C++中三种哈希结构(数组、set、map)的底层实现和性能特点。作者建议解决元素存在性判断问题时优先考虑哈希法,但需注意其空间换时间的特性。文章还澄清了不同语言中哈希相关容器的命名差异,强调哈希法是面试中判断元素存在的首选解决方案。
2025-08-13 15:09:16
727
原创 链表算法题总结
这个图是代码随想录知识星球 (opens new window)海螺人 (opens new window),所画,总结的非常好,分享给大家。考察链表的操作其实就是考察指针的操作,是面试中的常见类型。链表篇中开头介绍链表理论知识 (opens new window)关于链表,你该了解这些!虚拟头结点的技巧(opens new window)链表的增删改查(opens new window)反转一个链表(opens new window)删除倒数第N个节点(opens new window)
2025-08-13 09:50:15
724
原创 142.环形链表II
摘要: 题目要求找出链表中环的入口节点,若无环则返回null。使用快慢指针法判断是否有环:快指针(每次2步)和慢指针(每次1步)相遇即有环。数学推导环入口位置:设头到入口距离为x,入口到相遇点为y,相遇点到入口为z。根据相遇时路径关系(x+y=n(y+z)),当n=1时x=z,即从头和相遇点分别出发两个指针,相遇点即为环入口。该解法通过数学证明确保正确性,时间复杂度O(n),空间复杂度O(1)。
2025-08-13 09:47:14
738
原创 Spring(全网最详细)值得收藏
接下来我们通过一段代码模拟IOC思想。创建一个集合容器,先将对象创建出来放到容器中,需要使用对象时,只需要从容器中获取对象即可,而不需要重新创建,此时容器就是对象的管理者。创建实体类// 省略getter/setter/构造方法/tostring创建Dao接口和实现类// 根据id查询学生@Override// 模拟从数据库查找出学生return new Student(1,"百战程序员","北京");@Override// 模拟从数据库查找出学生。
2025-08-12 12:03:00
1290
原创 面试题 02.07. 链表相交
题目要求找出两个单链表的相交节点,若不相交则返回null。关键思路是:先计算两个链表的长度差,将较长链表的指针移动到与较短链表对齐的位置,然后同时移动两个指针比较节点是否相同。时间复杂度O(m+n),空间复杂度O(1)。 具体步骤: 遍历两个链表获取长度 计算长度差,调整指针位置使其对齐 同步移动指针寻找相同节点 若遍历结束未找到相同节点则返回null 该方法确保在原始链表结构不被修改的情况下高效解决问题。
2025-08-12 10:04:33
276
原创 19.删除链表的倒数第N个节点
摘要: 本文介绍了如何通过双指针法删除链表倒数第N个节点,重点解决边界问题(如删除头节点)。使用虚拟头节点统一操作逻辑,步骤如下: 初始化:快慢指针指向虚拟头节点; 快指针先行:快指针移动N+1步(确保慢指针停在待删除节点的前驱); 同步移动:快慢指针同时移动至链表末尾; 删除节点:修改慢指针的next指向。 注意点:Java中循环条件需写成n-- > 0,避免类型错误。该方法仅需一趟扫描,时间复杂度O(n)。示例代码演示了完整实现。
2025-08-11 10:01:43
870
原创 Mybatis(全网最详细)值得收藏
文章摘要: MyBatis框架是一个半自动ORM持久层框架,本质是对JDBC的封装,需手动编写SQL语句但免除了JDBC代码。其核心优势包括简化开发、提高效率、增强规范性,适用于高性能互联网项目。文章详细讲解了MyBatis的环境搭建、核心对象(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession)、映射文件配置、增删改查操作及动态SQL实现。特别介绍了关联查询(一对一、一对多、多对多)、缓存机制(一级/二级缓存)、注解开发与映射文件对比,以及PageH
2025-08-10 17:31:26
546
原创 24. 两两交换链表中的节点
摘要:本文讲解了如何通过虚拟头节点实现链表相邻节点的两两交换。算法使用三个指针(temp、firstnode、secondnode)分三步完成交换操作:1)将前驱节点指向第二个节点;2)将第二个节点指向第一个节点;3)将第一个节点指向后续节点。通过维护当前节点cur,确保每次交换后正确连接前后节点。代码使用while循环遍历链表,时间复杂度O(n),空间复杂度O(1)。关键点在于画图理清指针操作顺序和虚拟头节点的使用。
2025-08-10 15:15:31
297
原创 206.反转链表
摘要: 题目要求反转单链表,核心思路是通过改变节点指针方向实现,无需新建链表。双指针法:定义pre(null)和cur(head)指针,遍历时将cur.next指向pre,并移动pre和cur,直到cur为null时,pre即为新头节点。递归法:逻辑与双指针法一致,递归传递pre和cur参数,终止条件为cur为null时返回pre。两种方法时间复杂度均为O(n),空间复杂度O(1)(迭代)或O(n)(递归栈)。关键点在于指针方向的逐个反转处理。
2025-08-10 10:00:34
263
原创 Maven(全网最详细教程)
Maven简介与核心功能 Maven是一款跨平台的项目管理工具,基于POM模型标准化项目构建流程。其核心功能包括: 一键构建:通过简单命令完成编译、测试、打包等全流程 依赖管理:通过坐标系统从中央仓库/本地仓库自动获取JAR包,避免传统项目直接引入JAR的资源浪费 工程聚合:支持将大项目拆分为多个子模块(POM/JAR/WAR),提高代码复用率 关键特性 依赖调解机制:最短路径优先和最先声明原则解决版本冲突 生命周期管理:定义validate-compile-test-package-install-dep
2025-08-09 17:41:00
848
原创 707.设计链表
本文介绍了如何实现一个自定义链表类,包含5个核心操作:1.获取指定索引节点值(get);2.头插法(addAtHead);3.尾插法(addAtTail);4.在指定位置插入(addAtIndex);5.删除指定节点(deleteAtIndex)。提供了单链表和双链表两种实现方式,重点讲解了使用虚拟头节点简化边界处理的技巧。单链表实现中,通过size变量维护链表长度,双链表实现则额外利用头尾指针优化查找效率。两种实现都详细展示了链表基本操作的实现逻辑,包括节点插入、删除时的指针调整操作,是掌握链表数据结构的
2025-08-09 15:48:29
248
原创 203.移除链表元素
摘要: 题目要求删除链表中所有等于给定值的节点。解决方法有两种:1)直接操作原链表,需单独处理头节点;2)使用虚拟头节点,统一删除逻辑。示例代码展示了两种实现方式:无头结点版本需先处理头部连续目标值,再遍历剩余节点;有虚拟头结点版本则通过dummy节点简化操作,统一处理所有节点。两种方法时间复杂度均为O(n)。使用C++时建议手动释放内存,而Java/Python无需考虑。关键点在于正确处理节点指针的更新和边界条件。
2025-08-09 11:22:11
532
原创 算法知识(链表)
本文介绍了链表的基本概念和特性。链表是一种通过指针连接的线性结构,每个节点包含数据域和指针域。文章详细讲解了三种链表类型:单链表、双链表和循环链表,并对比了链表与数组在内存中的存储方式差异。在操作方面,重点说明了链表节点的增删方法及其时间复杂度。最后对比了链表和数组的特性,指出链表适合数据量不固定、频繁增删的场景。文章还提供了Java中链表节点的标准定义方式。
2025-08-09 11:00:10
518
原创 Servlet技术详解(含Tomcat)
本文摘要: JavaEE是一个企业级Web开发平台,包含13个技术规范(如Servlet、JSP等),但因其复杂性和性能问题逐渐被开源框架替代。Tomcat作为轻量级Web容器,实现了部分JavaEE规范,是Servlet/JSP的运行环境。文章详细介绍了Tomcat的安装配置、目录结构、启动关闭、虚拟主机配置等核心内容。 Servlet是JavaEE的核心组件,文章系统讲解了Servlet的生命周期、继承结构、请求响应处理(HttpServletRequest/HttpServletResponse)、会
2025-08-08 16:40:08
1339
原创 数组总结篇
本文总结了数组的理论基础及经典题型。数组是存储在连续内存空间中的同类型数据集合,通过索引快速访问元素。由于地址连续,增删元素需要移动其他元素。二维数组在内存中可能不连续(如Java)。文章重点讲解了四种经典解题方法:二分法(O(logn))、双指针法(O(n))、滑动窗口(O(n))和模拟行为,强调了循环不变量原则的重要性。此外还提及了前缀和技巧。这些方法体现了"思路简单但实现需要技巧"的特点,是面试中检验代码能力的常见题型。
2025-08-08 16:12:13
956
原创 44. 开发商购买土地(好难)
摘要: 该问题要求将n×m的二维土地区块划分给A、B两家公司,通过横向或纵向切割使两区域价值差最小。利用前缀和思想,分别计算行、列方向的前缀和,枚举所有可能的切割位置,比较两种划分方式下的价值差绝对值,取最小值作为结果。时间复杂度为O(n²)或O(m²),适用于100×100的数据规模。示例输入输出展示了最优划分可使差值为0的情况。
2025-08-08 16:07:56
252
原创 58. 区间和
本文介绍了两种计算数组区间和的方法:暴力法和前缀和法。暴力法直接遍历区间累加元素,时间复杂度为O(n)每次查询。前缀和法则预先计算累加数组,使得区间和查询可在O(1)时间内完成。文章通过图示说明前缀和原理(如p[5]-p[1]即为区间[2,5]的和),并强调区间边界处理的重要性。代码示例展示了两种方法的实现,比较了它们的效率差异,指出在查询量大时前缀和法的优势。
2025-08-08 09:49:43
221
原创 59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]其实这道题我是完全没有思路的。
2025-08-07 15:51:31
286
原创 计算机网络协议详解
摘要:本文系统介绍了计算机网络通信中的核心概念和技术。首先解释了通信协议作为计算机间通信"约定"的作用,重点阐述了OSI七层模型和TCP/IP协议栈。详细讲解了TCP协议的三次握手建立连接和四次挥手断开连接过程,以及HTTP协议的发展历程和特点。文章对比了HTTP/1.1和HTTP/2.0的关键区别,包括二进制传输、多路复用等新特性。同时介绍了URL、URI的概念区别,以及HTTP请求和响应的完整结构,包括请求方法、状态码、MIME类型等重要内容。
2025-08-07 11:41:32
316
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人