- 博客(60)
- 收藏
- 关注
原创 hot100-相交链表
摘要:本文介绍了力扣160题"相交链表"的优化解法。原解法需要计算链表长度差值,新解法通过双指针遍历两个链表:当指针到达链表末尾时,跳转到另一链表头部继续遍历。当两指针相遇时即为相交节点,否则同时到达null。这种"我走过你走过的路"的遍历方式,巧妙地解决了链表长度不同的问题,代码简洁高效。时间复杂度O(m+n),空间复杂度O(1)。
2025-12-16 20:24:08
188
原创 牛客-两个链表的第一个公共节点
题目:寻找两个链表的第一个公共节点 解题思路:通过计算两条链表的长度差,先让较长链表的指针移动差值步数,使剩余长度相同。然后同时移动双指针,直到找到相同节点。代码先计算链表长度,处理长度差后同步遍历,通过节点比较找到交点。时间复杂度O(m+n),空间复杂度O(1)。 关键点:长度差处理、同步遍历比较、边界条件判断(空链表或相同头节点)。
2025-07-20 18:04:10
303
原创 牛客-删除公共字符
摘要:该Java程序实现了删除字符串a中所有在字符串b中出现过的字符。通过将字符串b的字符存入HashSet集合,遍历字符串a时检查每个字符是否存在于集合中,不存在的字符则拼接至结果字符串。使用StringBuilder提升性能,并建议可用布尔数组替代HashSet优化空间。最终输出处理后的字符串。
2025-07-20 17:57:29
357
原创 牛客-游游的水果大礼包
题目要求用n个苹果和m个桃子制作两种水果礼包,礼包1(2苹果1桃子)价值a,礼包2(1苹果2桃子)价值b。解题思路是枚举可能的礼包1数量x,计算对应的礼包2数量y,取能使总价值ax+by最大的组合。x的取值范围是0到min(n/2,m),y取min(n-2*x, (m-x)/2)。通过遍历所有可能的x值,找到最大价值。代码使用long类型防止溢出,时间复杂度为O(min(n/2,m))。
2025-07-19 23:21:12
398
原创 牛客-买卖股票的最好时机二
本文介绍了解决"买卖股票的最好时机(二)"问题的贪心算法。与只能买卖一次的版本不同,该问题允许多次交易。解题核心思路是:只要后一天价格高于当天就进行买卖,累计所有可能的利润。具体实现遍历数组,当array[i+1] > array[i]时,将差值累加到总利润中。注意遍历范围是0到n-2,避免最后一天无法卖出的无效操作。这种方法通过捕捉所有上升区间,确保获得最大累计利润。
2025-07-19 22:38:45
201
原创 牛客-倒置字符串
摘要 本文介绍了一个字符串逆序问题的两种解法。第一种方法通过split()使用正则表达式"+"分割字符串为单词数组,处理多个连续空格情况,然后交换数组元素实现逆序,最后拼接时避免在末尾添加多余空格。第二种方法尝试先整体逆序再局部逆序,但由于StringBuilder的限制未能实现。代码细节包括正则处理空格和末尾空格判断,展示了字符串处理中的常见问题及解决方案。
2025-07-19 22:24:05
362
原创 牛客-买卖股票的最好时机(一)
这篇文章介绍了买卖股票最佳时机的贪心算法解法。题目要求在最低点买入、最高点卖出获取最大利润,但不能在买入前卖出。解题思路是:初始化前驱最小值为数组首元素,从第二个元素开始遍历,不断更新最大利润和前驱最小值。代码实现时需要注意正确读取输入数据并避免重复读取,最后使用三元运算符处理利润为负的情况。该方法避免了暴力解法的O(n^2)复杂度,优化为O(n)的高效解法。
2025-07-19 01:39:17
309
原创 力扣-找到字符串中所有字母异位符
本文解析了LeetCode题目LCR015"找到字符串中所有字母异位词"的滑动窗口解法。核心思路是使用两个哈希数组记录目标字符串p和滑动窗口中字符的频率,通过双指针维护窗口大小:1)右指针扩大窗口时更新字符计数,若字符符合p要求则增加有效计数count;2)当窗口超过p长度时,左指针移动并调整计数;3)当count等于p长度时记录左指针位置。关键细节包括:使用字符-'a'作为哈希索引,后置递减运算符保证正确性比较,以及使用if而非while处理窗口溢出。该算法时间复杂度为O(n),空间复
2025-05-28 22:16:50
1022
原创 力扣-将x减到0的最小操作数
【摘要】LeetCode 1658题要求找到将x减至0的最小操作数,通过从数组两端移除元素。正解困难时采用逆向思维:将问题转化为寻找和为sum-x的最长子数组。使用滑动窗口算法,维护窗口和temp,当temp等于目标值时更新最大窗口长度。最终结果为数组长度减去该子数组长度。关键点包括:初始化length为-1处理无解情况,while循环条件left<=right确保正确处理边界。该方法通过逆向转换将复杂问题简化,时间复杂度为O(n)。
2025-05-23 22:30:15
702
原创 力扣-无重复字符的最长子串
把left到right之间的元素都存入HashSet中,如果发现HashSet中已经包含了right下标的元素,就把left指针移动到重复元素的位置。同时,
2025-05-22 22:24:40
723
原创 力扣-长度最小的子数组
LCR008题目要求找到数组中元素和大于等于目标值的最短子数组长度。解题思路采用滑动窗口技术,通过双指针(left和right)遍历数组。right指针用于扩展窗口,计算当前窗口内元素的和;当和达到或超过目标值时,记录窗口长度并移动left指针缩小窗口,直到和小于目标值。重复此过程,直到right指针遍历完数组,期间不断更新最小窗口长度。代码实现中,length初始值设为Integer.MAX_VALUE,确保能正确更新最小长度。若未找到符合条件的子数组,则返回0。这种方法通过同向移动的双指针,高效地解决了
2025-05-22 21:15:23
736
原创 力扣-三数之和
题目LCR007.三数之和要求找出数组中所有不重复的三元组,使得它们的和为零。解题思路采用双指针结合定数指针的方法。首先对数组进行排序,然后固定一个指针在数组末尾,使用另外两个指针在剩余数组中进行遍历。根据三数之和与零的比较结果,移动指针以寻找满足条件的三元组。为了去重,使用Set存储三元组,最后将Set转换为List返回。代码中,通过Arrays.asList创建动态三元组,并在找到满足条件的三元组后,同时移动双指针以寻找下一个可能的三元组。这种方法有效利用了数组的单调性,提高了查找效率。
2025-05-21 21:54:55
447
原创 力扣-两数之和
题目LCR006要求在一个有序数组中找到两个数,使它们的和等于目标值。解题思路采用双指针法,定义左指针left指向数组起始位置,右指针right指向数组末尾。通过比较numbers[left] + numbers[right]与target的大小关系,移动指针:若和大于目标值,则右指针左移;若和小于目标值,则左指针右移;若和等于目标值,则返回两指针的索引。该方法利用数组的有序性,时间复杂度为O(n),空间复杂度为O(1)。
2025-05-21 21:24:21
413
原创 力扣-有效三角形的个数
本文介绍了如何解决LeetCode上的611题“有效三角形的个数”。首先,通过排序数组确保边长有序,简化三角形形成条件为a + b > c。接着,使用双指针和定数的方法,通过移动指针来统计满足条件的三角形数量。具体步骤包括:定义定数temp指向数组末尾,使用left和right指针遍历数组,根据nums[left] + nums[right]与nums[temp]的关系移动指针并累加有效三角形数量。最后,代码细节强调了排序的重要性以及指针和定数的正确使用。通过这种方法,可以高效地计算出数组中有效三角形
2025-05-21 20:54:31
700
原创 力扣-盛最多水的容器
题目“盛最多水的容器”要求找到两条垂直线,使得它们与x轴围成的容器能盛最多的水。容器的储水量由两条线之间的距离和较短线的高度决定。解题思路是使用双指针法,一个指针从数组的起始位置开始,另一个从末尾开始。通过比较两个指针所指的高度,移动较短边的指针,因为移动较长边的指针不会增加储水量。每次移动后计算当前容器的储水量,并更新最大储水量。最终,当两个指针相遇时,遍历结束,返回最大储水量。这种方法利用了数学的单调性判断,确保每次移动都能有效寻找更大的储水量。
2025-05-20 21:16:49
824
原创 力扣-快乐数
《快乐数》问题要求判断一个正整数是否为快乐数,即通过不断将数字替换为它每个位置数字的平方和,最终是否能得到1。题目分析指出,数字经过此操作后只有两种结果:陷入1的循环或陷入其他循环。通过类比链表带环问题,可以使用快慢指针法解决。快指针每次移动两步,慢指针每次移动一步,若两者相遇,则判断相遇点是否为1。代码实现中,快指针提前一步移动以加速相遇,且确保指针逻辑正确,避免固定值导致无限循环。最终,若相遇点为1,则为快乐数,否则不是。
2025-05-20 20:40:07
672
原创 力扣网-复写零
本文介绍了力扣(LeetCode)上第1089题“复写零”的解题方法。题目要求在原数组中复写所有的零,同时保持数组长度不变。解题思路采用双指针算法,首先通过嵌套双指针找到起始位置,处理特殊情况如数组倒数第二个元素为零时可能导致的越界问题。然后,从后往前遍历数组,根据当前元素是否为零进行相应的复写操作。通过巧妙地使用指针移动和赋值操作,确保在不覆盖原有数据的情况下完成复写任务。该方法有效避免了从前往后遍历时可能出现的覆盖问题,确保了算法的正确性和效率。
2025-05-19 22:00:42
571
原创 力扣-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
541
原创 生产者消费者模型
生产者消费者模型是一种,虽不在常见的23种设计模式中,但在面试中常被考察其实现方式(如)和应用场景(如消息队列、线程池工作队列)。:通过缓冲区实现生产者和消费者的解耦,平衡两者的处理速度差异,避免直接通信带来的紧耦合问题。
2025-05-14 11:52:12
480
原创 Get和Post的区别
GET和POST是 HTTP 协议中两种常用的请求方法,主要用于客户端与服务器之间的数据传输。在面试中常会被问到,Get和Post的区别,下面就来详细介绍一下。
2025-05-08 10:30:03
1766
原创 详解Redis
首先,什么是Redis?Redis(Remote Dictionary Server)是一个开源的、高性能的,常被用作缓存、消息队列、分布式锁等。
2025-05-07 08:47:30
893
原创 xshell中上传文件显示rz waiting to receive.
小编使用xshell上传文件到linux虚拟机的时候,一直显示rz waiting to receive.和"上传失败",
2025-04-24 19:43:16
419
原创 泛型T和object
在使用泛型的过程中,我发现了无论是T还是object好像都可以表示一切对象,那么他们到底有什么区别呢?T本身没有含义,在代码编译时会被转成object类型,T只是一个占位符,谨慎使用object,优先试用泛型T。
2025-04-23 16:28:41
574
原创 Gson、Fastjson 和 Jackson 对比解析
Gson、Fastjson 和 Jackson这三种都是Java生态中广泛使用的JSON处理库,用于实现Java对象与JSON数据之间的相互转换。
2025-04-11 19:48:24
2252
原创 XML、JSON 和 Protocol Buffers (protobuf) 对比
XML、JSON 和 Protocol Buffers (protobuf)这三种都是常用的数据交换格式,各有特点和适用场景。 接下来我会详细介绍这三种数据交换格式并对比其优缺点。
2025-04-11 17:55:54
705
原创 TCP的三次握手和四次挥手
三次握手的目的是确保双方通信能力正常,并同步初始序列号(ISN),防止历史重复连接干扰。四次挥手的目的是双方独立关闭双向通道,确保数据完整传输后再释放连接。
2025-04-09 18:12:25
880
原创 数据库中的事务
MySQL 中的事务(Transaction)是一组原子性的 SQL 操作,要么全部执行成功,要么全部失败回滚,保证数据库从一个一致状态转换到另一个一致状态。
2025-04-09 17:29:22
991
原创 构建一个最简单的UDP服务器和客户端并逐行解析
在 Java 网络编程中,**客户端(Client)服务器(Server)**是两个核心角色,它们共同构成了网络通信的基本模型(即以下我会构建一个最简单的服务器和客户端的代码。
2025-04-07 11:51:09
1332
原创 TCP/IP五层协议
TCP/IP 五层协议模型是为了教学和理论分析而提出的分层框架,它结合了 TCP/IP 四层模型的实用性和 OSI 七层模型的细节性,更清晰地描述数据从应用程序到物理介质的完整传输过程。
2025-04-06 11:17:13
1840
原创 多线程下使用哈希表
HashMap本身是不安全的,所以要在多线程下使用哈希表,我们可以使用:• Hashtable• ConcurrentHashMapHashtable 是 Java 早期提供的线程安全哈希表实现(),通过 全局锁(synchronized) 保证线程安全。简单来说,HashTable就是简单地把方法加上了synchronized关键字。这等于是直接对HashTable对象本身加锁。但是HashTable的性能较低
2025-04-06 08:47:18
869
原创 详解七大排序
在数据结构中,排序是组织和处理数据的核心操作之一。它不仅是数据组织的核心手段,更是提升计算效率、优化资源利用的基础。其应用贯穿于数据库、操作系统、机器学习、实时系统等领域,是算法设计与系统优化的基石。
2025-04-05 22:00:55
2351
1
原创 堆与二叉树的关系
堆本质上是通过完全二叉树的结构约束和节点值的顺序约束实现的特殊数据结构。其数组存储方式和高效调整算法(heapify)的结合,使得堆在需要快速获取极值的场景中表现出色。理解堆与二叉树的关系,有助于掌握优先队列、堆排序等核心算法,并为学习更复杂的树结构(如AVL树、B树)奠定基础。
2025-04-05 15:18:46
984
原创 普通类、抽象类和接口的区别
Java 8+注意:接口现在可以有默认方法实现,这使得接口和抽象类的界限变得模糊。通常建议优先使用接口,除非需要非静态、非final的成员变量或需要控制子类构造过程时才用抽象类。
2025-04-05 10:52:03
666
原创 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
826
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅