自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入浅出:具体场景下的redis分布式锁原理,实现与优化

本文介绍了Redis分布式锁的实现原理与优化方案。首先阐述了分布式锁的基本要求:互斥性、可见性、高可用、高性能和安全性。对比了MySQL、Redis和Zookeeper三种实现方式,重点讲解Redis基于setnx命令的实现方案。 文章详细说明了初级版本实现过程,包括获取锁和释放锁的核心逻辑,并指出存在的两个问题:误删锁和原子性问题。针对误删问题,提出通过线程标识校验的解决方案;针对原子性问题,引入Lua脚本确保"比较锁标识+删除锁"操作的原子性。 最后总结Redis分布式锁的特性:利用

2025-11-17 23:04:32 636

原创 你一定不能错过的高并发场景下的redis解决方案(优惠券下单秒杀 库存超卖 一人一单 集群下的线程安全)

本文探讨了分布式系统中优惠券秒杀业务的实现方案。首先介绍了全局唯一ID生成器的设计,采用64位结构(时间戳+序列号)解决数据库自增ID的安全性和分表问题。针对秒杀业务,分析了库存超卖和一人一单的并发问题,提出乐观锁(CAS)和悲观锁(synchronized)两种解决方案,并详细说明了锁粒度控制和事务一致性的处理方法。最后指出在集群环境下synchronized锁会失效,需要引入分布式锁机制。文章通过具体代码示例展示了优惠券管理和订单创建的完整流程,包括Redis全局ID生成、库存扣减等核心逻辑。

2025-11-17 23:03:30 1028

原创 Redis缓存 更新策略 双写一致 缓存穿透 击穿 雪崩 解决方案... 一篇文章带你学透

本文系统介绍了Redis缓存的核心概念及应用实践。首先阐述了缓存的基本原理,即通过快速存储层加速数据访问。然后详细讲解了缓存应用场景(如网页浏览、数据库查询)及优势(减轻服务器压力)。文章重点分析了三种缓存更新策略:内存淘汰、超时剔除和主动更新,并提出了数据库与缓存一致性解决方案(旁路缓存模式)。针对缓存三大问题:穿透(空值缓存/布隆过滤)、雪崩(随机TTL/集群部署)、击穿(互斥锁/逻辑过期),给出了具体解决思路和代码实现。最后介绍了封装Redis工具类的最佳实践,提升代码复用性。全文通过理论结合实战的方

2025-11-15 21:53:22 1005

原创 小白也能懂的最详细之Spring Bean的生命周期 Spring循环依赖 如何解决循环依赖 Spring三级缓存 依赖限制...一篇文章一网打尽

本文深入解析了Spring框架中的核心机制:首先详细阐述了Spring Bean的生命周期全过程,包括实例化、属性注入、初始化及销毁等关键阶段;其次重点讲解了Spring如何通过三级缓存(singletonObjects/earlySingletonObjects/singletonFactories)巧妙解决循环依赖问题,特别分析了AOP代理对象在循环依赖中的处理策略;最后指出解决方案的限制条件(仅支持单例模式且不适用于构造器注入),并提供了@Lazy注解等应对方案。全文系统揭示了Spring容器启动和依

2025-10-30 17:13:00 844

原创 一篇文章带你了解:SpringAI 竟然如此好玩(二)

文章摘要:本文介绍了SpringAI开发框架的三种主要模式:纯Prompt开发、FunctionCalling和RAG。纯Prompt模式通过设定系统提示词实现功能,如哄女友模拟器;FunctionCalling模式结合AI意图理解与传统Java功能,实现智能客服等复杂业务;RAG模式通过外挂知识库解决大模型知识限制问题,使用向量数据库进行相似度检索。文章详细讲解了各模式的实现原理和代码示例,展示了SpringAI的强大功能和灵活性。

2025-08-23 16:21:09 1314

原创 一篇文章带你了解:SpringAI 竟然如此好玩(一)

本文介绍了大模型应用开发的四种主流技术架构:1. 纯Prompt模式:通过精心设计的提示词引导模型输出理想答案;2. Function Calling:将传统应用功能封装为函数,实现与大模型的协同工作;3. RAG(检索增强生成):结合信息检索技术解决模型知识局限性问题;4. Fine-tuning(模型微调):基于预训练模型使用领域数据进行二次训练。文章重点演示了如何利用SpringAI框架快速搭建对话机器人,包括基础对话实现、System设定、日志记录、跨域处理以及会话记忆功能开发,详细说明了如何通过C

2025-08-23 14:21:43 1082

原创 Spring全家桶知识点总结(二)

Spring框架提供了多个Bean扩展点,包括BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor等,在Bean生命周期中会调用9次后置处理器。Spring Bean是由IoC容器管理的对象,可通过XML、注解、JavaConfig等方式配置,有单例、原型等作用域。单例Bean的优势包括减少实例创建开销、降低GC压力和提高访问速度。Spring Bean线程安全取决于是否使用成员变量,无状态的单例Bean是线程安全的。实例化方式包括构造器反

2025-08-14 17:40:18 959 1

原创 从Spring容器的启动开始,一篇文章带你搞懂SpringIOC加载过程

Spring容器启动的核心是创建ApplicationContext对象,它负责加载配置、创建BeanDefinition(存储类配置信息)并管理Bean生命周期。容器启动时首先读取配置信息(如XML或注解),扫描带有@Component等注解的类生成BeanDefinition。获取Bean时,容器检查单例池,若不存在则通过反射实例化对象,处理依赖注入(@Autowired),最终将完整Bean存入单例池。整个过程涉及懒加载处理、循环依赖解决等机制,最终通过ApplicationContext提供Bean

2025-08-14 14:42:54 672

原创 Spring全家桶知识点总结(一)

什么是spring核心解释控制反转1OC:面向切面编程AOP:容器:包含并管理应用对象的生命周期。

2025-08-13 16:42:52 1134

原创 保姆级教学带你拿下Java中的锁机制(下 )

Java并发编程中的AQS与锁机制详解 摘要:本文深入解析了Java并发编程的核心组件AQS(AbstractQueuedSynchronizer)及其在锁实现中的应用。AQS通过volatile状态变量和CLH队列实现线程同步,支持独占锁(如ReentrantLock)和共享锁(如Semaphore)。重点分析了可重入锁的实现原理,包括公平锁与非公平锁的区别:公平锁严格按队列顺序获取,非公平锁允许插队提高吞吐量。同时探讨了分段锁、锁粗化和锁消除等优化技术。文章还详细解读了Condition接口的线程协作机

2025-07-21 17:25:48 856

原创 保姆级教学带你拿下Java中的锁机制(上)

Java中的锁分为乐观锁和悲观锁两大类。乐观锁基于CAS机制,通过比较交换实现无锁并发,包括自旋锁、AtomicXXX类、LongAdder等实现,适用于低竞争场景。悲观锁以synchronized为代表,采用对象头MarkWord实现锁升级(无锁→偏向锁→轻量级锁→重量级锁),重量级锁通过Monitor实现线程阻塞与唤醒。二者在内存可见性、线程阻塞、适用场景等方面存在显著差异:乐观锁避免线程阻塞但可能引起CPU空转,悲观锁保证安全性但可能带来性能开销。JVM通过锁升级、自旋优化等机制平衡性能与安全性。

2025-07-16 07:17:15 992

原创 Springboot仿抖音app开发之Nacos 分布式服务与配置中心(进阶)

本文总结了基于SpringBoot的仿抖音App开发过程中多个功能模块的后端实现经验,重点介绍了RabbitMQ异步解耦和Nacos配置管理的应用。文章详细阐述了Nacos的核心功能:服务注册发现、动态配置管理、命名空间隔离和负载均衡,并形象地将Nacos比作"服务电话簿+配置管理员"。通过实际项目案例,展示了如何利用Nacos实现数值同步入库、动态配置变更和服务集群管理。特别讲解了IP漂移技术中的双机热备和双主热备模式的区别及应用场景,为构建高可用微服务系统提供了实用方案。文中还包含具体的技术实现代码和配

2025-06-20 21:20:08 1243 1

原创 Springboot仿抖音app开发之RabbitMQ 异步解耦(进阶)

的方法,并将返回值注册到Spring容器中。对于RabbitMQ组件,Spring AMQP会自动检测这些Bean并在RabbitMQ服务器上创建对应的实体。如果没有中间件(微信群)生产者给消费者发消息需要逐个去发送对应的消息,有了中间件之后只需要 统一发送就行,消费者去找自己对应的消息。其他相关的操作也同样进行异步解耦即可,我们已经在消费者模型中做了if判断处理。:记录用户行为 → 发送消息通知 → 更新推荐算法数据。:用户下单 → 扣减库存 → 生成订单 → 扣款。

2025-06-19 00:55:11 926

原创 Springboot仿抖音app开发之消息业务模块后端复盘及相关业务知识总结

这是一个在Repository接口中定义的方法,Spring Data会根据方法名自动生成查询实现。

2025-06-14 22:42:56 1483 2

原创 Springboot仿抖音app开发之评论业务模块后端复盘及相关业务知识总结

一个 String 类型的 Value 过大(超过 10KB)一个 Hash/List/Set/ZSet 类型的元素过多(比如 Hash 有数千个字段)

2025-06-12 21:21:59 1060

原创 Springboot仿抖音app开发之粉丝业务模块后端复盘及相关业务知识总结

本文详细介绍了短视频平台中用户关注与互粉功能的实现方案。系统采用分层架构,控制层负责参数验证、业务规则检查及Redis计数更新;服务层处理关注关系创建、互粉逻辑及消息通知;数据层通过MyBatis实现关系存储。系统使用Redis缓存关注状态和计数,实现高性能查询,避免数据库瓶颈。文章还分析了互粉关系的三种判断方案,重点推荐基于Redis的实现方式,并介绍了分页查询的封装方法。整体设计兼顾功能完整性和性能优化,为社交功能开发提供了实用参考。

2025-06-12 01:50:00 1139

原创 Springboot仿抖音app开发之用短视频务模块后端复盘及相关业务知识总结

前端通过HTTP GET请求访问/indexListuserId:当前用户ID(可选)search:搜索关键词(可选)page:页码pageSize:每页显示条数。

2025-06-11 01:33:41 942

原创 Springboot仿抖音app开发之用户业务模块后端复盘及相关业务知识总结

super("异常状态码为:" + responseStatusEnum.status()+ ";具体异常信息为:" + responseStatusEnum.msg());@Data@ToString@NotBlank(message = "手机号不能为空")@NotBlank(message = "验证码不能为空")// 可能还有其他字段这个BO类通过注解(如@NotBlank)定义了参数验证规则。系统定义了文件类型枚举BGIMG(1, "用户背景图"),

2025-06-10 17:42:23 966

原创 后端Web实战之登录认证,JWT令牌,过滤器Filter,拦截器Interceptor一篇文章so easy!!!

- 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行preHandle()方法,这个方法执行完成后需要返回一个布尔类型的值,如果返回true,就表示放行本次操作,才会继续访问controller中的方法;如果返回false,则不会放行(controller中的方法也不会执行)。

2025-04-28 14:38:27 1264

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(下)!附完整源码

如果部门下有员工,则不允许删除该部门,并给前端提示错误信息:对不起,当前部门下有员工,不能直接删除!我们看到响应数据的样例是一个集合,每个集合里面又有对应的键值对,所以我们可以想到通过。准备工作,和之前类似,先写好控制层,实现层,接口层及其实现方法层,以及各种实体类。我们响应的数据里有两个,所以我们可以考虑封装到一个记录结果的实体类中。这个不难,我们只需要在删除部门的时候新写一个逻辑判断就行。学员学历信息统计接口开发:参照接口文档 数据统计。班级人数统计接口开发:参照接口文档 数据统计。

2025-04-26 15:22:29 1157 3

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(中)!

分页查询,相信大家再看了上一篇文章的学习之后都不陌生了,如果有些遗忘的话可以再去看看哦。准备工作,和之前类似,先写好控制层,实现层,接口层及其实现方法层,以及各种实体类。到此,关于学生管理的增删改查功能,我们就已经全部实现了。接口描述:该接口用于学员列表数据的条件分页查询。接口描述:该接口用于根据主键ID查询学员的信息。接口描述:该接口用于修改学员的数据信息。接口描述:该接口用于修改学员的数据信息。接口描述:该接口用于批量删除学员信息。接口描述:该接口用于添加学员信息。参照接口文档 学员管理。

2025-04-26 14:42:40 1144

原创 关于Tlias智能学习辅助系统班级学员管理和数据统计管理接口开发(java后端)的复盘,手把手教你根据接口文档规范开发接口(上)!

在修改班级的功能中,我们需要通过动态sql进行mapper层中的数据处理,因为我们修改的数据可以是一个,几个或者全部,动态sql可以更好的处理这些情况。因为需要查询班级下是否有学员,我们在开发的过程中可以先将这一部分留到学员管理开发的时候一起完成,这里因为是已经开发完的完整版本,我就不省略啦。我们分页查询的几个范围和条件就是根据班级名称,起始时间,结束时间进行查询,日期则是按照年月日的格式去查询 ,实体类如上,接下来我们看接口。在进行insert方法的时候,不需要去给id赋值,因为id是自增的,如下即可。

2025-04-26 13:34:15 1775 2

原创 不吃饭也要看的多线程教学,等待唤醒机制,生产者消费者模型,多线程的六种状态

概述生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。所谓生产者消费者问题,实际上主要是包含了两类线程:​ 一类是生产者线程用于生产数据​ 一类是消费者线程用于消费数据为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为Object类的等待和唤醒方法方法名说明。

2025-04-22 23:19:22 826

原创 蹲厕所也要看的一篇文章教你搞懂线程的安全问题,同步代码块,同步方法,locck锁,死锁!(详细上手)

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。如果你的代码是单线程,不用考虑多线程中数据安全的情况,直接用StringBuilder就行,如果需要考虑,就用StringBuffered。在图示中,线程一旦进入在休眠的时候就会退出,然后重新抢夺,最后在一起休眠的时候但是已经进入,就超过了100。如果你有多个锁,那你的进入进出就是不确定的,一个锁决定一个行为。

2025-04-22 20:41:16 791

原创 再遇见线程!一篇文章教你全部搞懂多线程,并发并行,优先级,各种成员方法,生命周期,干货多多哦

为完成特点的任务,用某种语言编写的一组指令的集合,简单来说就是我们的代码 线程是由进程创建的,是进程的一个实体,一个进程可以拥有多个线程,如下图。 下载的程序运行作为进程,进程里的三个下载对应三个线程。 每个进程拥有独立的内存空间,内存空间内变量不相互影响。 一个进程可以拥有多个线程,线程共享地址空间,线程之间相互影响。单线程:一个进程如果只有一条执行路径,则称为单线程程序​ 多线程:一个进程如果有多条执行路径,则称为多线程程序 总结:方法介绍实现步骤代码:多线程

2025-04-21 19:50:49 878

原创 热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串

可能有的朋友想,为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。此外我还定义了int型的sum变量来统计单一结果path里的总和,其实这个sum也可以不用,用target做相应的减法就可以了,最后如何target==0就说明找到符合的结果了,但为了代码逻辑清晰,我依然用了sum。(这两个参数可以放到函数参数里)

2025-04-20 20:22:36 721

原创 热门面试题第18天|Leetcode538.把二叉搜索树转换为累加树77题. 组合77.组合优化216.组合总和III17.电话号码的字母组合(开始回溯算法)

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]左右子树也必须是二叉搜索树。

2025-04-15 12:21:37 1119

原创 热门面试题第17天|Leetcode701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树

你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。这道题其实不难,我们不要被它看起来有效的很多种情况给唬住了,我们只需要遍历二叉搜索树,找到对应的地方添加节点,返回给上一级节点就行。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

2025-04-15 00:18:50 722

原创 热门面试题第16天|Leetcode530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 235. 二叉搜索树的最近公共祖先

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

2025-04-13 12:35:48 777

原创 热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索

其实这个最大二叉树的定义和二叉搜索树非常像,我们能想到的是先找到里面最大的节点,将其放在根节点,然后去它的左子树里面寻找,接着去右子树里面寻找,属于前序遍历。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。左中右,中序遍历找到最左边,最小的节点值,然后一层一层返回去判断当前节点值是否大于pre,一旦有一个节点不满足,就会返回false 然后向上返回回去。当根节点为空或者我们找到了对应值的节点的时候,我们直接返回就行。

2025-04-11 22:39:44 1212

原创 热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。

2025-03-25 23:50:37 857

原创 热门面试题第13天|Leetcode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

我们用StringBuilder来拼接字符串,然后我们开始循环遍历path将其存入sb中,注意不要遍历到最后一个元素,因为题目要求“->”,所以我们遍历到倒数第二个元素即可,然后将再单独添加卒子后一个元素,最后将拼接的sb添加给res,然后结束方法。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。当然是其左子树高度和其右子树高度的差值。节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。

2025-03-24 16:00:41 964

原创 热门面试题第12天|Leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 (内含热门面试题)

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。左节点,右节点分别为空时,我们只需要考虑另一边的最小深度的情况就行,两者都不为空的时候,我们在考虑取最小值+1。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。高度从下到上,深度从上到下,但是求最大深度,其实和求最大高度的结果是一样的。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。比较的是两个子树的里侧和外侧的元素是否相等。

2025-03-23 21:29:15 794

原创 热门面试题第11天|Leetcode刷题一篇文章教会你二叉树 递归遍历 迭代遍历层序遍历(内含热门面试题)

递归遍历 (必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单前序中左右,我们直接将中的val加入进,然后再递归左右子树即可后序和中序也是同理,只是顺序不同,但遍历的节点对象为null时,直接退出方法就行,我们直接看代码。迭代遍历我们来看迭代的思路我们在进行前序遍历的时候,按照的是中左右的顺序,思路如下我们从根节点开始读取,每读取一个根节点,将其存入栈,然后每次取出的时候将取出的节点的右左节点依次放进栈里面即可我们来看代码。

2025-03-13 22:34:52 600

原创 热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了,暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。

2025-03-09 20:58:13 1045

原创 代码随想录算法训练营第九天|Leetcode 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

因为队列是先进先出,我们在push的时候直接将元素push进输入栈就可以,但是在pop或者peek的时候,如果输出栈为空,需要先将输入栈 的元素压入输出栈,再将输出栈的元素做对应的操作,这样才实现了先进先出的性质。在stackout里面有元素的时候,我们不用再将stackin的元素push进去,因为已经是按照顺序的,我们只需要等stackout的元素全部处理完再将stackin的元素处理即可。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2025-03-09 17:00:43 1341

原创 代码随想录算法训练营第八天|Leetcode 151.翻转字符串里的单词 卡码网:55.右旋转字符串 字符串总结 双指针回顾

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。我们这道题的思路是,先将整个字符串反转,结束之后再定位每一个单词,然后再将单词进行反转,思路为什么是这样子的呢。我们思路和之前一样,先整体反转,然后反转前n个字符,再反转剩余字符,为什么这样做呢,因为可以。建议:题解中的解法如果没接触过的话,应该会想不到。151.翻转字符串里的单词。卡码网:55.右旋转字符串。

2025-03-09 12:30:25 374

原创 代码随想录算法训练营第七天|Leetcode 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

先对数组进行扩容,在遍历字符串的时候出现数字字符就将长度+5处理,然后根据扩容的数组长度去new一个新数组,再将输入的字符读取进创建新数组对应的位置,再从后往前进行遍历,,碰到数字就从最后一位开始往前遍历,没碰到就把字符赋值给对应的位置。我们先理解一下题目意思,如图所示,在图中画了个字符串,令k=3,2k=6,我们将字符串的2k范围内的前k位进行翻转,然后再从2k+1的地方进行上述操作,如果长度<k,我们就不变,途中剩下gh均<k,所以我们需要反转。当然我们也可以用最基础的temp完成交换操作。

2025-03-05 20:54:34 462

原创 代码随想录算法训练营第六天|Leetcode454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

15. 三数之和建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。和之前我们遇到的两数之和不同,两数之和可以很快的通过哈希表完成作答两层for循环就可以确定 两个数值,可以使用哈希法来确定 第三个数 0-(a+b) 或者 0 - (a + c) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。

2025-03-05 16:54:54 983

原创 代码随想录算法训练营第五天|Leetcode1. 两数之和,349. 两个数组的交集242.有效的字母异位词 202. 快乐数(内含Hash知识点详解)

哈希数组更加适用于频繁查找和计数统计的操作,我们来看思路,我们创建两个hash数组,将两个输入数组中的值分别存入哈希数组中,这样数组的索引作为键,数组的值作为计数次数,然后我们得到了两个哈希数组,只要判断相同索引的两个哈希数组的值是否都大于0就行,如果都大于0,就说明这个元素是重复的,我们再创建一个动态数组吗,因为具备扩容的功能等,但是最后返回的时候还是需要创建一个普通数组,因为题目要求的返回方法是int,我们来看代码。建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。

2025-03-04 22:33:18 989

空空如也

空空如也

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

TA关注的人

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