- 博客(53)
- 收藏
- 关注
原创 力扣-找到字符串中所有字母异位符
本文解析了LeetCode题目LCR015"找到字符串中所有字母异位词"的滑动窗口解法。核心思路是使用两个哈希数组记录目标字符串p和滑动窗口中字符的频率,通过双指针维护窗口大小:1)右指针扩大窗口时更新字符计数,若字符符合p要求则增加有效计数count;2)当窗口超过p长度时,左指针移动并调整计数;3)当count等于p长度时记录左指针位置。关键细节包括:使用字符-'a'作为哈希索引,后置递减运算符保证正确性比较,以及使用if而非while处理窗口溢出。该算法时间复杂度为O(n),空间复
2025-05-28 22:16:50
861
原创 力扣-将x减到0的最小操作数
【摘要】LeetCode 1658题要求找到将x减至0的最小操作数,通过从数组两端移除元素。正解困难时采用逆向思维:将问题转化为寻找和为sum-x的最长子数组。使用滑动窗口算法,维护窗口和temp,当temp等于目标值时更新最大窗口长度。最终结果为数组长度减去该子数组长度。关键点包括:初始化length为-1处理无解情况,while循环条件left<=right确保正确处理边界。该方法通过逆向转换将复杂问题简化,时间复杂度为O(n)。
2025-05-23 22:30:15
607
原创 力扣-无重复字符的最长子串
把left到right之间的元素都存入HashSet中,如果发现HashSet中已经包含了right下标的元素,就把left指针移动到重复元素的位置。同时,
2025-05-22 22:24:40
638
原创 力扣-长度最小的子数组
LCR008题目要求找到数组中元素和大于等于目标值的最短子数组长度。解题思路采用滑动窗口技术,通过双指针(left和right)遍历数组。right指针用于扩展窗口,计算当前窗口内元素的和;当和达到或超过目标值时,记录窗口长度并移动left指针缩小窗口,直到和小于目标值。重复此过程,直到right指针遍历完数组,期间不断更新最小窗口长度。代码实现中,length初始值设为Integer.MAX_VALUE,确保能正确更新最小长度。若未找到符合条件的子数组,则返回0。这种方法通过同向移动的双指针,高效地解决了
2025-05-22 21:15:23
679
原创 力扣-三数之和
题目LCR007.三数之和要求找出数组中所有不重复的三元组,使得它们的和为零。解题思路采用双指针结合定数指针的方法。首先对数组进行排序,然后固定一个指针在数组末尾,使用另外两个指针在剩余数组中进行遍历。根据三数之和与零的比较结果,移动指针以寻找满足条件的三元组。为了去重,使用Set存储三元组,最后将Set转换为List返回。代码中,通过Arrays.asList创建动态三元组,并在找到满足条件的三元组后,同时移动双指针以寻找下一个可能的三元组。这种方法有效利用了数组的单调性,提高了查找效率。
2025-05-21 21:54:55
399
原创 力扣-两数之和
题目LCR006要求在一个有序数组中找到两个数,使它们的和等于目标值。解题思路采用双指针法,定义左指针left指向数组起始位置,右指针right指向数组末尾。通过比较numbers[left] + numbers[right]与target的大小关系,移动指针:若和大于目标值,则右指针左移;若和小于目标值,则左指针右移;若和等于目标值,则返回两指针的索引。该方法利用数组的有序性,时间复杂度为O(n),空间复杂度为O(1)。
2025-05-21 21:24:21
373
原创 力扣-有效三角形的个数
本文介绍了如何解决LeetCode上的611题“有效三角形的个数”。首先,通过排序数组确保边长有序,简化三角形形成条件为a + b > c。接着,使用双指针和定数的方法,通过移动指针来统计满足条件的三角形数量。具体步骤包括:定义定数temp指向数组末尾,使用left和right指针遍历数组,根据nums[left] + nums[right]与nums[temp]的关系移动指针并累加有效三角形数量。最后,代码细节强调了排序的重要性以及指针和定数的正确使用。通过这种方法,可以高效地计算出数组中有效三角形
2025-05-21 20:54:31
647
原创 力扣-盛最多水的容器
题目“盛最多水的容器”要求找到两条垂直线,使得它们与x轴围成的容器能盛最多的水。容器的储水量由两条线之间的距离和较短线的高度决定。解题思路是使用双指针法,一个指针从数组的起始位置开始,另一个从末尾开始。通过比较两个指针所指的高度,移动较短边的指针,因为移动较长边的指针不会增加储水量。每次移动后计算当前容器的储水量,并更新最大储水量。最终,当两个指针相遇时,遍历结束,返回最大储水量。这种方法利用了数学的单调性判断,确保每次移动都能有效寻找更大的储水量。
2025-05-20 21:16:49
706
原创 力扣-快乐数
《快乐数》问题要求判断一个正整数是否为快乐数,即通过不断将数字替换为它每个位置数字的平方和,最终是否能得到1。题目分析指出,数字经过此操作后只有两种结果:陷入1的循环或陷入其他循环。通过类比链表带环问题,可以使用快慢指针法解决。快指针每次移动两步,慢指针每次移动一步,若两者相遇,则判断相遇点是否为1。代码实现中,快指针提前一步移动以加速相遇,且确保指针逻辑正确,避免固定值导致无限循环。最终,若相遇点为1,则为快乐数,否则不是。
2025-05-20 20:40:07
647
原创 力扣网-复写零
本文介绍了力扣(LeetCode)上第1089题“复写零”的解题方法。题目要求在原数组中复写所有的零,同时保持数组长度不变。解题思路采用双指针算法,首先通过嵌套双指针找到起始位置,处理特殊情况如数组倒数第二个元素为零时可能导致的越界问题。然后,从后往前遍历数组,根据当前元素是否为零进行相应的复写操作。通过巧妙地使用指针移动和赋值操作,确保在不覆盖原有数据的情况下完成复写任务。该方法有效避免了从前往后遍历时可能出现的覆盖问题,确保了算法的正确性和效率。
2025-05-19 22:00:42
523
原创 力扣-283-移动零
题目“移动零”要求将数组中的所有零元素移动到数组的末尾,同时保持非零元素的相对顺序。解题思路采用双指针法,定义两个指针dest和cur,其中dest初始值为-1,表示非零区间的右边界,cur从0开始遍历数组。在遍历过程中,当cur指向的元素非零时,将其与dest+1位置的元素交换,并更新dest和cur的位置。最终,数组被划分为非零区间[0, dest]和零区间[dest+1, nums.length-1],满足题目要求。该题思想与快速排序类似,通过0作为临界值进行数组划分。
2025-05-17 22:01:39
505
原创 生产者消费者模型
生产者消费者模型是一种,虽不在常见的23种设计模式中,但在面试中常被考察其实现方式(如)和应用场景(如消息队列、线程池工作队列)。:通过缓冲区实现生产者和消费者的解耦,平衡两者的处理速度差异,避免直接通信带来的紧耦合问题。
2025-05-14 11:52:12
407
原创 Get和Post的区别
GET和POST是 HTTP 协议中两种常用的请求方法,主要用于客户端与服务器之间的数据传输。在面试中常会被问到,Get和Post的区别,下面就来详细介绍一下。
2025-05-08 10:30:03
1018
原创 详解Redis
首先,什么是Redis?Redis(Remote Dictionary Server)是一个开源的、高性能的,常被用作缓存、消息队列、分布式锁等。
2025-05-07 08:47:30
700
原创 xshell中上传文件显示rz waiting to receive.
小编使用xshell上传文件到linux虚拟机的时候,一直显示rz waiting to receive.和"上传失败",
2025-04-24 19:43:16
256
原创 泛型T和object
在使用泛型的过程中,我发现了无论是T还是object好像都可以表示一切对象,那么他们到底有什么区别呢?T本身没有含义,在代码编译时会被转成object类型,T只是一个占位符,谨慎使用object,优先试用泛型T。
2025-04-23 16:28:41
463
原创 Gson、Fastjson 和 Jackson 对比解析
Gson、Fastjson 和 Jackson这三种都是Java生态中广泛使用的JSON处理库,用于实现Java对象与JSON数据之间的相互转换。
2025-04-11 19:48:24
1091
原创 XML、JSON 和 Protocol Buffers (protobuf) 对比
XML、JSON 和 Protocol Buffers (protobuf)这三种都是常用的数据交换格式,各有特点和适用场景。 接下来我会详细介绍这三种数据交换格式并对比其优缺点。
2025-04-11 17:55:54
543
原创 TCP的三次握手和四次挥手
三次握手的目的是确保双方通信能力正常,并同步初始序列号(ISN),防止历史重复连接干扰。四次挥手的目的是双方独立关闭双向通道,确保数据完整传输后再释放连接。
2025-04-09 18:12:25
822
原创 数据库中的事务
MySQL 中的事务(Transaction)是一组原子性的 SQL 操作,要么全部执行成功,要么全部失败回滚,保证数据库从一个一致状态转换到另一个一致状态。
2025-04-09 17:29:22
938
原创 构建一个最简单的UDP服务器和客户端并逐行解析
在 Java 网络编程中,**客户端(Client)服务器(Server)**是两个核心角色,它们共同构成了网络通信的基本模型(即以下我会构建一个最简单的服务器和客户端的代码。
2025-04-07 11:51:09
1118
原创 TCP/IP五层协议
TCP/IP 五层协议模型是为了教学和理论分析而提出的分层框架,它结合了 TCP/IP 四层模型的实用性和 OSI 七层模型的细节性,更清晰地描述数据从应用程序到物理介质的完整传输过程。
2025-04-06 11:17:13
1067
原创 多线程下使用哈希表
HashMap本身是不安全的,所以要在多线程下使用哈希表,我们可以使用:• Hashtable• ConcurrentHashMapHashtable 是 Java 早期提供的线程安全哈希表实现(),通过 全局锁(synchronized) 保证线程安全。简单来说,HashTable就是简单地把方法加上了synchronized关键字。这等于是直接对HashTable对象本身加锁。但是HashTable的性能较低
2025-04-06 08:47:18
747
原创 详解七大排序
在数据结构中,排序是组织和处理数据的核心操作之一。它不仅是数据组织的核心手段,更是提升计算效率、优化资源利用的基础。其应用贯穿于数据库、操作系统、机器学习、实时系统等领域,是算法设计与系统优化的基石。
2025-04-05 22:00:55
1392
1
原创 堆与二叉树的关系
堆本质上是通过完全二叉树的结构约束和节点值的顺序约束实现的特殊数据结构。其数组存储方式和高效调整算法(heapify)的结合,使得堆在需要快速获取极值的场景中表现出色。理解堆与二叉树的关系,有助于掌握优先队列、堆排序等核心算法,并为学习更复杂的树结构(如AVL树、B树)奠定基础。
2025-04-05 15:18:46
872
原创 普通类、抽象类和接口的区别
Java 8+注意:接口现在可以有默认方法实现,这使得接口和抽象类的界限变得模糊。通常建议优先使用接口,除非需要非静态、非final的成员变量或需要控制子类构造过程时才用抽象类。
2025-04-05 10:52:03
553
原创 CAS: Compare-And-Swap(比较并交换)
CAS 操作包含三个参数:内存地址(V)、旧的预期值(A)以及新值(B)。仅当内存地址 V 处的值和旧的预期值 A 相同时,才会把该地址处的值更新为新值 B。ABA 问题指的是,在CAS 操作期间,内存地址 V 处的值先从 A 变成 B,之后又从 B 变回 A。这时,CAS 操作会认为值没有发生变化,从而继续执行更新操作,但实际上值已经经历了改变。
2025-04-04 18:21:10
665
原创 多线程编程中的锁策略
锁策略(Locking Strategies)是多线程编程中用于控制并发访问共享资源的核心机制。不同的锁策略在等方面有显著差异。
2025-04-04 11:51:21
902
原创 多线程中run方法和start方法的异同
在多线程编程中,run() 和 start() 是两种完全不同的方法,它们的核心区别在于 线程的启动和执行方式。
2025-04-04 10:19:27
344
原创 详细分析单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。单例模式常用于管理共享资源(如数据库连接池、线程池、配置对象等)。其中的设计模式指的是,是面向对象编程的经验总结。它们分为和三大类。简要说就是类似于框架,是大佬们提供的可供使用的一种“公式”。
2025-04-02 20:53:47
1018
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人