自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 FloodFill算法题目

与上一题的思想类似,如果我们按照正常的逻辑,验证某个位置能否流入太平洋或者大西洋,下一次遍历其他位置时,可能还会经历上一次的路径,就会导致判断重复路径,时间复杂度较高,因此,本道题我们也采用正难则反的思想。那么,被标记两次的点,就是我们要找的结果。本道题的意思是我们要找到某个位置,使这个位置既可以流入太平洋也可以流入大西洋,能否流动取决于数值大小,大的数字可以流向小于等于它的数字。可以先利用dfs 将与边相连的O区域做上标记,然后重新遍历矩阵,将没有标记过的O 修改成X 即可。的像素,将其修改为目标颜色。

2026-02-26 22:12:43 789

原创 记忆化搜索

因为策略 1 的最坏成本(1)比策略 2(2)小,这就是 “确保获胜的最小现金数”—— 选策略 1,只要准备 1 元,不管对手选 1 还是 2,你都能赢,且这是最少需要准备的钱。要考虑 “最坏情况”:比如你选了一套猜测策略,对手选的数字会让你花最多的钱,这个 “最多的钱” 就是这套策略的成本;以n=5为例,我们可以发现递归的过程中,d(3)被重复计算两次,那我们就可以给递归加个记事本(备忘录)”,让程序记住已经算过的子问题,避免重复计算。问题:我们要在「所有可能的最坏情况」中,找到「成本最低」的那个策略。

2026-02-09 13:56:06 582

原创 买卖股票问题

本文将介绍六道买卖股票问题从易到难,用到了贪心算法以及动态规划算法。

2026-02-03 22:28:25 741

原创 MySQL事务介绍

事务是将一组 SQL 操作打包成的 “不可分割的执行单元”,要么全部成功(提交),要么全部失败(回滚),绝不存在 “执行一半” 的中间状态。最经典的例子就是转账:张三给李四转 100 元,核心是两条 SQL—— 张三余额 - 100、李四余额 + 100。事务能保证:要么两条 SQL 都执行成功,要么都不执行,不会出现 “张三钱少了但李四没收到” 的情况。

2026-02-02 22:38:52 715

原创 合并区间(贪心算法)

再根据上图可以得出,有交集的时候,合并过程中左端点依旧是left,而右端点需要选择较大值。2、根据排序后的结果,总结出一些规律,进而得出解决这个问题的策略。本道题实际上是让我们求并集,可以采用左端点排序(排完序可以发现,这时我们先把给定区间加入到结果数组中,然后让。,针对后面的区间在进行上述合并过程。1、排序(左端点或右端点)

2026-01-31 13:24:32 258

原创 N皇后(剪枝策略)

以此类推,我们可以总结出一些规律,不难发现,每一层都在做相同的事情,对于不合法的情况,我们剔除,合法的话我们就进行下一层判断。,记录这一列是否有皇后,如果有这个值为true,我们在下一层就不需要考虑这个值为true的情况。(这里不需要偏移量,不会发生数组越界问题,直接判断两数相加的值在不在数组中)n为4的时候,我们可以画出2*n-1=7条线,所以我们在定义一个。放置完第0行,我们分别来看这四种情况对应的第1行应该怎么放。固定好第0行皇后的位置之后,我们放置第一行也有四种情况,的数组来表示副对角线的情况。

2026-01-31 11:25:33 402

原创 MySQL索引介绍

回表查询是指非聚集索引查询时,叶子节点仅存主键,需通过主键再次查询聚集索引获取完整数据的过程。②将高频查询列纳入复合索引。当查询的列刚好是索引列(或复合索引的所有列)时,无需回表,直接从索引中获取数据,称为 “索引覆盖”。索引与数据分离存储,叶子节点存储 “索引键 + 主键值”,需通过主键值回表查询完整数据(此过程称为 “回表”)。禁忌:不要过度建索引(一张表建议不超过 5 个)、不要在低频查询列建索引、不要在大字段(如 TEXT)建索引。非聚集索引依赖聚集索引,删除聚集索引会导致所有非聚集索引失效。

2026-01-27 22:06:46 668

原创 Redis总结

高性能的 key-value 内存数据库,以键值对形式存储数据,支持持久化到硬盘,不依赖 “表” 结构,核心优势是简单易用和高性能。核心逻辑简单,性能瓶颈多在内存或 IO,而非 CPU,多线程无明显收益;避免多线程带来的线程安全问题和线程切换开销;6.0 后引入多线程优化:仅用于处理网络请求和协议解析,命令执行仍保持单线程,提升 IO 处理效率。Redis 高可用解决方案,由多个哨兵节点组成,监控主从节点状态,自动完成故障发现和故障转移;监控:定期检测数据节点和其他哨兵节点是否可达;

2026-01-25 17:16:41 727

原创 Redis应用(缓存和分布式锁)

Redis 启动或大量 key 失效后,提前将热点数据写入缓存,避免缓存空窗期导致数据库压力骤增。

2026-01-24 19:45:43 761

原创 RabbitMQ相关问题总结

支付成功后,支付系统向 MQ 发送 “支付完成” 消息,订单系统(更新订单状态)、库存系统(扣减库存)、财务系统(记账)、积分系统(增加积分)订阅该消息,同步完成各自业务逻辑,避免多系统频繁查询支付结果。定义:接收生产者发送的消息,根据路由键(Routing Key)和绑定规则(Binding)将消息路由到对应的队列。,队列绑定交换机时指定路由键,生产者发送消息时指定路由键,交换机仅将消息路由到路由键匹配的队列。,生产者发送消息到交换机,交换机将消息路由到所有绑定的队列,每个队列的消费者都能收到消息。

2026-01-24 15:50:39 844

原创 Redis集群介绍

槽位数量太少会导致单个槽数据量大,迁移慢,槽位数量太多的话会增加节点之间的心跳包开销(心跳包需要携带槽位位图,16384个槽仅需2KB,65536个仅需8KB)

2026-01-23 18:30:20 729

原创 Redis哨兵机制介绍

— 不仅恢复慢,还容易出错,完全不符合生产环境的高可用要求。而 Redis 哨兵(Sentinel)的核心作用,就是:主节点挂了,哨兵能自动检测、自动选新主、自动同步数据,全程无需人工干预,这也是 哨兵的核心价值。

2026-01-23 15:52:31 695

原创 RabbitMQ集群和仲裁队列

使用仲裁队列可以在RabbitMQ节点间进行队列数据的复制,从而达到在一个节点宕机时,队列仍然可以提供服务的效果。由Leader发起,将客户端的消息(操作日志)同步给所有的Follower,定期发送心跳,宣告自己存活,组织其他节点发起选举。由Candidate发起,竞选Leader时,向其他节点拉票,每个节点在一个任期内。如果一个节点的当前任期号比其他节点小,那么它就将自己的任期号更新为较大的那个值.:所有客户端都连同一个节点,这个节点网络负载爆满,其他节点闲得慌,浪费资源。

2026-01-23 11:16:23 707 2

原创 RabbitMQ相关问题(1)

一句话概括: 生产者按照顺序 消息A -> 消息B -> 消息C 发送消息,消费者也严格按照 消息A -> 消息B -> 消息C 的顺序进行消费和处理。

2026-01-22 15:11:14 783

原创 Redis主从复制介绍

部分复制:处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节 点后,如果条件允许,主节点会补发数据给从节点。:① 作为 A 的从节点,同步 A 的数据;全量复制:一般初次复制场景,会把主节点全部 数据⼀次性发送给从节点,当数据量较大时,会对主从节点和⽹络造成很大的开销。从节点:开启 AOF → 保证数据不丢(就算主节点数据丢了,从节点的 AOF 能恢复全部数据,保证数据安全。树形主从结构使从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。

2026-01-21 16:08:20 674

原创 Redis持久化:RDB与AOF

Redis提供RDB和AOF两种持久化机制。RDB通过定期生成数据快照实现持久化,支持手动/自动触发,采用bgsave方式避免阻塞主进程,具有恢复速度快但可能丢失数据的特性。AOF通过记录写操作命令实现持久化,支持多种同步策略和重写机制来优化性能,数据安全性更高但恢复较慢。两种方式各有优劣,RDB适合灾难恢复,AOF适合实时持久化。Redis 4.0引入混合持久化,结合了两者优点。

2026-01-20 23:49:45 721

原创 Redis基础知识及五种类型操作

lpush:讲一个或多个元素从左侧放入(头插)到List中返回List的长度lpushx:当key存在的时候将一个或者多个元素头插到List中,不存在的话直接返回(注意与lpush的区别)rpush:将一个或者多个元素尾插到List中rpushx:当key存在时,将一个或者多个元素尾插到List中lrange:获取从start到end区间的所有元素,闭区间lpop:从 List左侧取出元素(头删)lpop keyrpop:从List右侧取出元素(尾删)rpop key。

2026-01-18 12:41:26 600

原创 垃圾回收介绍

在程序运行过程中,内存管理是至关重要的环节。如果开发者手动管理内存,稍有不慎就可能出现内存泄露、野指针等问题,严重影响程序的稳定性。而垃圾回收机制的出现,为我们解决了这些难题。下面,我们就来总结一下垃圾回收的核心知识点。

2025-07-23 22:49:31 820

原创 类加载过程及双亲委派模型

这里的二进制字节流可以从多种来源获取,比如从本地文件系统中的.class 文件读取、从 JAR 包中读取、通过网络下载、由其他文件生成(如 JSP 文件被编译成.class 文件)等。类加载过程是 JVM 将类的字节流加载到内存并进行处理,最终形成可执行代码的过程,包括加载、验证、准备、解析和初始化五个阶段,每个阶段都有其独特的作用,共同保证了类能够正确地被 JVM 识别和使用。​双亲委派模型则是类加载器遵循的重要机制,它通过层级委派。

2025-07-22 21:57:34 844

原创 IP协议介绍

IPv4使用4个字节作为IP地址,IPv6使用16个字节作为IP地址,2^128,这是一个天文数字,可以保证所有设备IP地址唯一,但是由于IPv6和IPv4不兼容,升级的话需要更换设备,所以现在IPV6普及率较低。形如这个过程,我们逐渐询问接下来的地址,因为网络环境是相当复杂的,任何一个路由器无法存储所有网络信息,不过每个路由器都可以知道附近的网络情况。只给接入网络的设备分配IP地址,因此同⼀个MAC地址的设备,每次接⼊互联网中得到的IP地址不⼀定是相同的。实际偏移的字节数是这个值*8得到的。

2025-07-20 20:53:59 854

原创 TCP协议介绍

TCP协议属于TCP/IP 协议族的传输层协议,主要用于在两台设备之间提供可靠、有序、面向连接的数据传输服务。校验和;序列号(按序到达);确认应答;超时重发;连接管理;流量控制;拥塞控制。

2025-07-19 16:04:50 847

原创 UDP协议介绍

UDP(User Datagram Protocol,用户数据报协议)是 TCP/IP 协议簇中位于传输层的核心协议之一,是一种无连接、不可靠但高效的传输层协议。UDP 以其简洁的报文结构和高效的传输特性,在实时通信等领域发挥着重要作用。它的报文结构简单明了,首部仅 8 字节,数据部分灵活承载应用数据。但同时,UDP 也存在无连接、不可靠、缺乏流量控制和拥塞控制等局限性。在实际应用中,我们需要根据具体的业务需求选择合适的协议。

2025-07-18 14:40:07 1281

原创 HTTPS加密流程

对称加密就是加密和解密使用同一个秘钥非对称加密使用一对密钥(公钥和私钥),用公钥加密的数据,只能用对应的私钥解密;用私钥加密的数据(或生成的签名),只能用对应的公钥验证。HTTPS加密过程有三组密钥。

2025-07-17 17:26:17 719

原创 HTTP协议介绍

HTTP(超⽂本传输协议)是一种应用层协议,往往基于传输层的TCP协议实现;

2025-07-16 23:30:05 2360 2

原创 网络基本概念

2、​数据封装:请求数据从应用层开始,逐层经过传输层(添加 TCP/UDP 头部,包含端口号)、网络层(添加 IP 头部,包含 A 和 B 的 IP 地址)、数据链路层(添加 MAC 头部和尾部),最终封装成帧。4、​数据分用:主机 B 接收到帧后,从数据链路层开始逐层剥离头部,依次经过网络层、传输层,最终将请求数据传递到对应的应用程序(根据端口号匹配)。1、发起请求:主机 A 的应用程序(如浏览器)生成请求数据,明确要与主机 B 的某个服务(通过端口号指定,如 80 端口的 HTTP 服务)通信。

2025-07-10 17:45:42 818

原创 HashTable、HashMap 与 ConcurrentHashMap 的区别总结

在java集合框架中,HashTable、HashMap、ConcurrentHashMap都是基于哈希表实现的键值对存储结构,但它们在线程安全性、性能、功能特性等方面存在显著差异,本文将从多个维度对比这三者的区别。

2025-07-07 21:20:00 622 1

原创 总结synchronized

Java中的synchronized是一种内置线程同步机制,具有多种锁特性:开始时采用乐观锁(CAS)和轻量级锁(自旋),在高竞争时升级为悲观锁和重量级锁;它是不公平锁、可重入锁,但不支持读写锁。synchronized可用于同步方法(实例和静态)及代码块,通过锁住对象或Class对象实现线程安全。其锁升级机制包括无锁→偏向锁(记录线程ID)→轻量级锁(CAS自旋)→重量级锁(线程阻塞),根据竞争情况动态调整,优化性能。

2025-07-05 22:27:33 788

原创 线程池相关介绍

线程池是管理多线程任务执行的关键技术,通过复用线程资源避免频繁创建销毁开销。Java线程池包含7个核心参数:核心/最大线程数、空闲超时时间、任务队列、线程工厂和拒绝策略。ThreadPoolExecutor的工作流程是:先使用核心线程处理任务,队列满则创建新线程至最大值,最后触发拒绝策略。Executors类提供了四种常用线程池:FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool.

2025-07-03 22:42:11 820

原创 多线程案例——单例模式

单例模式是一种确保类仅有一个实例的设计模式,适用于全局对象管理场景。主要实现方式包括饿汉式(类加载时创建实例,简单但可能浪费资源)和懒汉式(延迟加载需处理线程安全)。针对懒汉式的线程安全问题,可通过同步锁和双重检查锁(配合volatile防止指令重排序)优化。该模式在配置管理、日志系统等需要全局唯一对象的场景中具有重要应用价值。

2025-07-01 22:44:16 710

原创 线程安全问题

线程安全是多线程编程中最核心的问题之一。理解线程安全问题的根源,掌握各种解决方案的适用场景和优缺点,是编写高质量并发程序的基础。在实际开发中,应优先考虑使用Java并发包提供的高级工具类,而非自己实现同步机制,这样既能保证正确性,又能提高开发效率。

2025-07-01 12:09:52 1173

原创 java线程状态

状态变化简易图实例化│▼NEW (新建)│▼│ (可运行) │ ││ │ ││ │ 竞争锁失败 ││ ▼ ││ BLOCKED (阻塞) ││ │ ││ │ 获取到锁 ││ ▼ │▼ │ │WAITING (无限等待) ││ │ │▼ ▼ │TIMED_WAITING (超时等待) ││ │ ││ │ 超时/被唤醒 │││ 执行完成▼TERMINATED (终止)

2025-05-08 16:15:48 1206

原创 Thread类的基本用法

每个Thread对象,只能start一次,因此上每次想创建一个新线程必须创建一个新的Thread类1.1继承Thread类@Overridet.start();// 注意是调用start()而不是run()*必须重写run()方法;通过start()方法启动新线程;不能直接调用run()方法,这样不会创建新线程1.2、实现 Runnable 接口@Overridet.start();1.3、使用Lambda 表达式});t.start();

2025-05-04 22:39:00 808

原创 栈和队列相关实现

思路:入栈:1、普通栈一定要放,最小栈放的原则是,如果最小栈为空,则放;模拟出队:判断第二个栈是不是空的,如果是,直接取出栈顶元素,如果不为空,将栈1中元素全部放到栈2,取出栈顶元素。模拟出栈:把不为空的队列中size-1个元素放到另一个队列中,最后剩下的这个就是我们模拟出栈的元素。如果采用尾插法入栈:入栈时间复杂度O(n),如有last,为O(1),但是出栈一定是O(n)(1)队列实现栈:两个队列,模拟入栈:放到不为空的队列当中;(2)用栈实现队列:两个栈,模拟入队:放到第一个栈;

2025-05-01 20:07:32 510

原创 进程与线程

总结:进程是资源分配的单元,线程是CPU调度的单元;3、eg浏览器的一个标签页可能用一个线程加载页面,另一个线程播放视频,共享浏览器的内存空间。1、性能:线程切换比进程切换快得多,适合高并发任务(如Web服务器处理大量请求)。3、eg同时运行的浏览器和音乐播放器是两个独立的进程,它们的内存和资源完全隔离。1、多进程:需要高稳定性(如浏览器每个标签页独立进程)、隔离性(如安全沙箱)。2、多线程:需要高效协作(如游戏渲染+逻辑线程)、高并发(如数据库连接池)。:一个进程崩溃通常不会影响其他进程(稳定性高);

2025-05-01 19:33:24 496

原创 数据结构第六章 树和二叉树

1、定义:给定n个结点的集合,结点编号为1~n,再给定一个等价关系,由等价关系产生所有结点的一个划分,每个结点属于一个等价类,所有等价类是不相交的。若它有左孩子结点,将左孩子结点进队。(2)在森林T中选取两棵根结点权值最小的子树作为左、右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根的权值之和。度为1的结点称为单分支结点,度为2的结点称为双分支结点,依次类推。(1)、满二叉树:所有分支结点都有左孩子结点和右孩子结点,并且叶子结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。

2024-05-04 19:32:13 921 1

原创 第五章 递归(数据结构)

(2)执行pow(x,10)的递归调用顺序是: pow(x,10) → pow(x,5) → pow(x,2) → pow(x,1) 共发生4次递归调用。设大问题Hanoi(n,x,y,z)的执行时间为T(n),则小问题Hanoi(n-1,x,y,z)的执行时间为T(n-1)。设大问题Hanoi(n,x,y,z)的占用空间为S(n),则小问题Hanoi(n-1,x,y,z)的占用空间为S(n-1)。(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址进栈。

2024-04-22 23:10:06 3167

原创 指针的相关实现

回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数例如:使用函数指针实现计算器:首先我们需要定义四个运算函数:返回两个整数的和。:返回两个整数的差。:返回两个整数的乘积。:返回两个整数的商。menu():打印出计算器的菜单选项。:接受一个函数指针作为参数,然后提示用户输入两个操作数,并调用该函数指针指向的函数来计算结果,最后打印结果。定义一个整型变量input,用于存储用户的选择。

2024-04-19 21:09:16 417 1

原创 第四章 串和数组(数据结构python)

an-1),其中,A是数组名,ai(0≤i≤n-1)是数组A中序号为i的元素。,a0,n-1],…KMP算法的下一次比较si/tnext[1],而next[1]=0,并且t0=t1,说明一定有si≠tnext[1]  nextval[j]=nextval[next[j]]=-1。(1)如果有tj=tk成立,可以直接推出si≠tk成立,没有必要再做si/tk的比较,直接置nextval[j]=nextval[k](nextval[next[j]]),即下一步做si/tnextval[j]的比较。

2024-04-16 16:39:42 724 1

原创 第三章 栈和队列

1.1、栈(stack)是一种只能在同一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶(top),表的另一端称为栈底(bottom)。栈的插入操作通常称为进栈或入栈(push),栈的删除操作通常称为退栈或出栈(pop)。1.2、主要特点① 后进先出,即后进栈的元素先出栈。② 每次进栈的元素都作为新栈顶元素,每次出栈的元素只能是当前栈顶元素。③ 栈也称为后进先出表或者先进后出表。

2024-04-02 15:08:42 904 1

原创 深入理解指针

数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参访问的数组是同一个数组的,函数形参的部分理论上应该是使用指针变量来接收首元素的地址,在函数内部sizeof(arr)计算的是一个地址的大小,而不是数组的大小,正是因为函数的参数部分的本质是指针,所以函数内部是没办法求数组元素个数的。函数指针变量应该是存放函数地址的,未来通过地址能够调用函数的,函数名就是函数的地址,当然也可以通过&函数名来获得函数的地址,如果要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法和数组指针非常类似。

2024-03-28 16:36:24 804 1

空空如也

空空如也

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

TA关注的人

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