- 博客(89)
- 收藏
- 关注
原创 【LeetCode 热题 100】560. 和为 K 的子数组——(解法二)前缀和+哈希表
Problem:题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。子数组是数组中元素的连续非空序列。
2025-06-29 10:50:38
677
原创 【LeetCode 热题 100】560. 和为 K 的子数组——(解法一)前缀和+暴力
Problem:题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。子数组是数组中元素的连续非空序列。
2025-06-29 10:07:11
557
原创 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法三)不定长滑动窗口+数组
Problem:题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
2025-06-28 13:20:17
838
原创 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组
Problem:题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
2025-06-28 12:50:55
914
原创 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法一)定长滑动窗口+哈希表
Problem:题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
2025-06-28 11:30:27
622
原创 【LeetCode 热题 100】3. 无重复字符的最长子串——滑动窗口
Problem:题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
2025-06-27 11:24:08
752
原创 【LeetCode 热题 100】42. 接雨水——(解法三)单调栈
采用 单调栈 的方法来解决经典的 “接雨水” 问题。其核心目标是计算一个由非负整数代表的高程图(数组)能够 trapping(接住)多少单位的雨水。算法的整体思路可以分解为以下几个步骤:核心数据结构:遍历与处理:凹槽识别与计算:栈状态维护:结果返回:该算法通过维护一个单调递减的索引栈,巧妙地在找到一个“右边界”时,回溯并计算所有以它为右边界的、能够形成的凹槽的雨水量。时空复杂度时间复杂度:O(N)外层循环: 循环从 遍历到 ,它会执行 N 次,其中 N 是数组 的长度。这是 O(N) 的。内层
2025-06-27 10:14:16
1030
原创 【LeetCode 热题 100】42. 接雨水——(解法二)双指针
这段代码采用了双指针法来解决“接雨水”问题,这是一种空间复杂度更优的解法。其核心思想是在一次遍历中,通过动态维护左右两侧的最高墙,来计算每个位置可以接的雨水。代码的整体思路可以分解为以下步骤:核心问题:与前一个方法一样,代码旨在计算由数组 代表的柱子能接住的总雨水量。其基本原理不变:在任何一个位置 ,能接的雨水量取决于其左侧最高墙和右侧最高墙的较小者与当前墙高度的差,即 。双指针算法:此算法的核心在于巧妙地避免了预先计算并存储所有位置的左右最大高度,从而将空间复杂度从 O(N) 优化到 O(1)。累加
2025-06-24 00:15:00
659
原创 【LeetCode 热题 100】42. 接雨水——(解法一)前后缀分解
这段代码旨在解决经典的“接雨水”问题。给定一个非负整数数组,数组中的每个元素代表一个柱子的高度,柱子的宽度默认为1。目标是计算这些柱子之间能够 trapping(接住)多少单位的雨水。代码的整体思路可以概括为以下几个步骤:理解接水原理:对于数组中的任何一个位置 (代表一个柱子),它上方能接的雨水的高度取决于其左边所有柱子中的最高者()和其右边所有柱子中的最高者()。具体来说,水位高度将是 。如果这个水位高于当前柱子 的高度,那么在位置 上就能接到雨水,接到的雨水量为 。如果水位不高于当前柱子,则当前位
2025-06-24 00:00:00
693
1
原创 Java八股文——Git
特性/维度git mergegit rebase核心操作创建一个新的“合并提交”来汇合两个分支将一个分支的提交“平移”并重新应用到另一个分支的顶端提交历史保留真实历史,产生分叉和合并记录重写历史,形成一条线性的、干净的历史优点真实、可追溯,对团队协作安全提交历史清晰、整洁缺点历史记录可能变得复杂混乱(“意大利面条”)修改了历史,如果分支已被共享,会给他人带来麻烦。
2025-06-23 00:30:00
875
原创 Java八股文——Linux
常用命令组合核心作用ps -ef查看所有进程的完整信息,常用于grep查找特定进程ps aux查看所有进程的资源占用情况,常用于sort排序定位性能瓶颈查看指定进程下的所有线程,用于更细粒度的线程级问题排查虽然top命令可以动态地展示这些信息,但ps的优势在于它是一个静态快照,非常适合在脚本中或与其他命令(如grepawksort)通过管道结合使用,进行自动化的分析和处理。方法优点缺点/注意事项常用场景ps + kill通用性最强,所有Unix-like系统都支持步骤稍多,需要手动处理grep。
2025-06-23 00:15:00
2539
原创 Java八股文——系统场景设计
前端:CDN + 静态化 + 交互限流,过滤90%以上的无效流量。网关:IP/UID限流,拦截恶意攻击。服务层读:通过Redis缓存预热,抗住海量查询。写(库存):通过Redis + Lua脚本进行原子性的库存预扣减,解决最核心的并发瓶颈。写(订单):通过消息队列进行异步化,实现削峰填谷,保护后端数据库。数据层:通过乐观锁保证数据库库存一致性,通过幂等消费保证订单不重复创建。保障:通过监控告警和降级预案,保证系统的稳定运行。
2025-06-23 00:00:00
919
原创 Java八股文——分布式(下)
做什么:ZooKeeper主要用于实现分布式锁、服务注册与发现、配置管理等分布式协调任务。怎么做:它通过类似文件系统的树形数据模型(Znode)和强大的Watch机制,为上层应用提供了丰富的操作接口。如何保证可靠:其底层通过ZAB协议,以主从复制和过半数提交的方式,保证了在分布式环境下数据的一致性和系统的容错能力。总的来说,ZooKeeper是一个CP系统,它在任何时候都优先保证数据的一致性,是构建可靠分布式系统的关键基础设施。算法名称核心思想优点缺点固定窗口固定时间窗口内计数实现简单。
2025-06-22 01:15:00
732
原创 Java八股文——分布式(上)
架构选择放弃的特性保证的特性优点缺点典型系统CP可用性 (A)一致性 (C) + 分区容错性 (P)数据强一致,可靠延迟高,分区时可能部分不可用AP一致性 (C)可用性 (A) + 分区容错性(P)高可用,响应快数据弱一致(最终一致性)CA分区容错性(P)一致性 (C) + 可用性 (A)(理论模型,不存在于分布式系统中)无法应对网络分区,不是分布式系统传统的单体数据库在现代大规模互联网应用的设计中,由于对高可用性的要求越来越高,越来越多的系统倾向于选择AP。
2025-06-22 01:00:00
591
原创 Java八股文——消息队列「RabbitMQ篇」
特性核心实现/机制带来的优势可靠性持久化 + 生产者Confirm + 消费者ACK提供了端到端的消息不丢失保证灵活性四种交换机类型 (Direct, Fanout, Topic, Headers)能够实现极其复杂的、精细化的消息路由逻辑高可用镜像队列 (Mirrored Queues)通过多副本和自动故障转移,保证服务不中断功能全面死信队列、TTL、优先级队列、插件生态能优雅地处理各种异常情况和复杂的业务需求总的来说,RabbitMQ凭借其成熟、稳定、功能全面的特性,在。
2025-06-22 00:15:00
1757
原创 Java八股文——消息队列「Kafka篇」
优化方面关键技术/设计带来的好处磁盘I/O顺序写操作系统Page Cache极高的写入速度,高效的内存缓存数据传输零拷贝 (sendfile)减少CPU消耗和内存拷贝,极高的投递速度网络效率批量处理数据压缩减少网络往返次数和数据量,提升网络吞吐系统架构分区模型 (Partition)实现了高并发和水平扩展正是这一系列从底层I/O到顶层架构的、环环相扣的优化设计,共同造就了Kafka无可匹敌的高性能。面试官您好,Kafka的模型设计非常独特,它并不是一个传统意义上的消息队列,而是一个。
2025-06-22 00:00:00
1545
原创 【LeetCode 热题 100】15. 三数之和——排序 + 双指针解法
这段代码旨在解决经典的算法问题——。其核心目标是:从一个给定的整数数组nums中,找出所有和为 0 的、不重复的三元组。该代码采用的策略,这是一种高效解决此类问题的标准方法。:首先,对整个输入数组nums进行升序排序。:代码使用一个for循环来遍历排序后的数组。在每次循环中,它“固定”一个数nums[l]作为三元组的第一个元素。这样,原问题就从“找三个数”简化为“在数组的剩余部分找两个数,使它们与nums[l]的和为 0”。:对于每个固定的nums[l],代码在其右侧的子数组[l+1, n-1]中使用。
2025-06-21 10:51:46
500
原创 Java八股文——消息队列「RocketMQ篇」
如果你的系统…那么你应该选择…是一个数据管道,处理海量日志/流数据Kafka是一个业务系统,处理复杂交易/状态流转RocketMQ关于“Kafka可能丢数据”这是一个常见的误解。Kafka通过配置acks=all,并结合(要求写入成功的最小同步副本数)参数,可以实现与RocketMQ同等级别甚至更高的数据可靠性保证,但这样做会牺牲一部分性能。所以,与其说Kafka会丢数据,不如说它给了用户在性能和可靠性之间做选择的灵活性。最终,技术选型是一个权衡的过程。
2025-06-21 01:00:00
1334
原创 Java八股文——消息队列「场景篇」
解决消息重复消费问题的核心,是在消费端实现幂等性。首先,为每一条需要幂等处理的消息,确定一个全局唯一的业务ID。然后,在消费时,通过数据库唯一键或Redissetnx等方式,构建一个“判重系统在执行核心业务逻辑前,先进行判重检查,如果发现消息已被处理,就直接丢弃,并正常ACK,保证流程的顺畅。通过这种方式,即使MQ重复投递了消息,我们的业务系统也能保证最终结果的正确性。生产者:使用同步发送 + ACK确认 + 失败重试。MQ服务端:开启持久化 + 集群部署 + 多副本机制。消费者:关闭。
2025-06-21 00:00:00
617
原创 Java八股文——数据结构「排序算法篇」
算法名称平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n)O(n²)O(1)稳定选择排序O(n²)O(n²)O(n²)O(1)不稳定插入排序O(n²)O(n)O(n²)O(1)稳定快速排序O(n log n)O(n log n)O(n²)O(log n)不稳定归并排序O(n log n)O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(n log n)O(1)
2025-06-20 16:49:45
388
原创 Java八股文——数据结构「数据结构篇」
数据结构主要优点主要缺点Java中的实现ArrayListO(1) 随机访问O(n) 插入/删除动态数组LinkedListO(1) 插入/删除O(n) 随机访问双向链表HashMapO(1) 平均增删查无序,哈希冲突影响性能哈希表TreeMapO(log n) 增删查,且有序性能略低于HashMap红黑树O(1) 查最值,O(log n) 增删只能访问最值堆特性/维度数组 (Array)链表 (Linked List)内存结构连续存储离散存储随机访问 (读)O(1),极快。
2025-06-20 15:50:22
481
1
原创 Java八股文——操作系统「网络 I/O 篇」
I/O模型第一阶段 (等待数据)第二阶段 (拷贝数据)特点BIO阻塞阻塞简单,但并发性能差NIO非阻塞(需用户轮询)阻塞避免阻塞,但CPU空转I/O 复用阻塞(在上,但可监视多个FD)阻塞高效管理大量连接,Java NIO的核心信号驱动非阻塞阻塞利用信号通知,应用较少AIO非阻塞(由内核完成)非阻塞(由内核完成)真异步,性能最高特性/维度selectpollepoll连接数限制有 (约1024)无无时间复杂度O(n)O(n)O(1)工作模式被动轮询被动轮询主动回调。
2025-06-20 14:52:12
773
原创 Java八股文——操作系统「内存管理篇」
面试官您好,虚拟内存和物理内存是现代操作系统内存管理中的两个核心概念,它们之间是映射关系,而不是简单的等同关系。1. 物理内存(Physical Memory)是什么:物理内存就是我们常说的内存条,它是计算机上真实存在的硬件。它的容量是固定的,比如8GB、16GB,是所有进程最终要运行的地方。你可以把它想象成一个实际的、有限大小的仓库。特点资源有限:大小是固定的,所有程序共享这个有限的资源。地址唯一:每个存储单元都有一个唯一的、真实的物理地址。由硬件直接访问:CPU通过地址总线直接访问。
2025-06-20 11:54:51
763
原创 【LeetCode 热题 100】11. 盛最多水的容器——Java双指针解法
的优化算法来解决“盛最多水的容器”问题。与暴力枚举所有可能性的 O(n²) 方法不同,双指针法通过一种更智能的收缩策略,仅需一次遍历即可找到最大面积,效率极高。这两个指针代表了当前考虑的容器的左右两个边界。:这是算法的关键所在。:算法所需的额外存储空间是常数级别的,因此空间复杂度为。相遇),意味着所有具有潜力的容器都已被考虑过。指向数组的第一个元素(索引 0),:算法的执行时间与输入数组的规模。指向数组的最后一个元素(索引。)来寻找下一个可能的更大容器。中存储的就是最终的最大面积。:算法设置两个指针,
2025-06-20 10:36:47
876
原创 Java八股文——计算机网络「传输层篇」
面试官您好,TCP的拥塞控制,是TCP协议中最高级、也最能体现其“智能”和“社会责任感”的机制。如果说流量控制(Flow Control)是为了解决“点对点”之间,发送方不要撑爆接收方的问题,那么拥塞控制(Congestion Control)就是为了解决“点对网”之间,发送方不要撑爆整个网络的问题。1. 为什么需要拥塞控制?—— 避免“公地悲剧”正如您所分析的,互联网是一个共享资源。如果每一个TCP连接都只顾自己,以最快的速度疯狂地发送数据,那么很快就会导致网络中的路由器不堪重负,发生。
2025-06-19 14:21:10
868
原创 【LeetCode 热题 100】283. 移动零——Java双指针解法
将一个整数数组中的所有零元素移动到数组的末尾,同时保持所有非零元素的原始相对顺序。此操作要求在原数组上直接进行修改(in-place),而不创建新的数组副本。这种方法非常巧妙且高效,因为它仅通过一次完整的遍历就完成了所有非零元素的重新排列,并且是在常数级别的额外空间内完成的。
2025-06-19 10:30:22
1186
原创 Java八股文——计算机网络「应用层篇」
面试官您好,您提出的这个问题,直击了现代Web架构从单体走向分布式过程中,身份认证方式演进的核心驱动力。1. 首先,什么是集群部署?集群部署,简单来说,就是为了应对高并发、保证高可用,我们将同一个应用程序,同时部署在多台服务器上,然后通过一个负载均衡器(Load Balancer),将用户的请求分发到这些不同的服务器实例上去处理。2. 传统Session-Cookie方式在集群中的“困境”在单机时代,传统的Session-Cookie方式工作得很好。但一旦进入集群部署,它就遇到了一个。
2025-06-18 19:47:22
955
原创 Java八股文——计算机网络「网络模型篇」
面试官您好,TCP/IP模型,也叫TCP/IP协议簇(Protocol Suite),它不是一个单一的协议,而是一整套网络通信协议的集合。与OSI七层模型不同,TCP/IP模型并不是一个纯粹的理论框架,而是源于实践、并最终成为互联网事实标准的一套模型。它更简化、更核心,直接定义了今天互联网是如何工作的。TCP/IP模型通常被划分为四层1. 应用层 (Application Layer)对应OSI模型:相当于OSI的应用层、表示层、会话层的合体。职责:直接面向用户和应用程序,负责。
2025-06-18 15:27:40
735
原创 Java八股文——Redis「场景篇」
面试官您好,热Key问题,也叫热点Key问题,是我们在使用Redis时,需要重点关注和处理的一种典型的“数据访问倾斜”问题。1. 什么是热Key?一个Key之所以被称为“热Key”,并不是因为它本身有什么特殊,而是因为它在某个时间段内,被访问的频率(QPS)极高,导致绝大部分的请求压力都集中在了这个单一的Key上。QPS集中(最常见)比如,整个Redis实例的总QPS是5万,但其中一个Key(比如一个爆款商品的ID)的QPS就占了4万。带宽集中这通常发生在大Key和高QPS的组合下。
2025-06-18 14:58:58
362
原创 Java八股文——Redis「集群篇」
面试官您好,整个选主过程,正是在主节点被确认“客观下线”,并且哨兵集群选举出一位“Leader”之后,由这位Leader来唯一地执行的。这个“选主算法”,并不是一个单一的算法,而是一套层次分明、逐步筛选的规则。Leader哨兵会像一个严谨的面试官一样,对所有从节点进行层层考察,最终挑选出最合适的那一位“继任者”。这个筛选过程,严格按照以下优先级顺序第一轮筛选:健康与状态检查(过滤掉不合格的)Leader哨兵会首先遍历所有从节点,并淘汰掉必须是在线状态。
2025-06-18 12:58:57
763
原创 Java八股文——Redis「淘汰删除篇」
面试官您好,Redis的内存淘汰策略,是当Redis的物理内存使用量达到maxmemory上限时,为了能继续服务新的写入请求,而必须执行的一种“自我保护”机制。它定义了“当内存满了,应该扔掉哪个数据来腾出空间”的规则。Redis提供了非常丰富的淘汰策略,正如您所分析的,我们可以将这八种策略,按照两个维度来进行一个清晰的分类。第一层分类:是否进行淘汰?noeviction这是Redis 3.0之后至今的默认策略。行为:当内存达到上限时,它不淘汰任何数据。对于后续的所有写入命令(如SETLPUSH。
2025-06-18 11:24:33
891
原创 Java八股文——Redis「事务篇」
面试官您好,在Redis中实现原子性,我们需要分两种情况来讨论:单条命令的原子性和多条命令组合的原子性。然而,在很多业务场景中,我们需要将多个Redis命令组合成一个不可分割的操作单元。比如,经典的“读取-修改-写回”(Read-Modify-Write)模式。如果简单地将多条命令一条条地发送给Redis,那么在这些命令的执行间隙,就可能会有其他客户端的命令插进来,从而破坏了我们想要的原子性。为了解决这个问题,Redis提供了几种方案,其中Lua脚本是目前最推荐、也是最强大的方式。终极方案:Lua脚本通过
2025-06-18 11:07:51
1031
原创 Java八股文——Redis「数据结构篇」
面试官您好,listpack是Redis在5.0版本中引入、并在7.0版本中正式全面取代ziplist的一种新的紧凑型列表数据结构。在保留ziplist极高空间利用率这一核心优点的同时,彻底解决ziplist最致命的“连锁更新”(Cascading Update)问题。我们可以把listpack看作是ziplist的一次“青出于蓝而胜于蓝”的进化。1. 回顾ziplist的“阿喀琉斯之踵”——连锁更新要理解listpack的精妙之处,我们必须先回顾ziplist为什么会被取代。ziplist。
2025-06-17 16:01:52
1284
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人