- 博客(28)
- 收藏
- 关注
原创 substring() 方法完全解析
摘要:Java的substring()方法用于字符串截取,包含单参数(截取至末尾)和双参数(指定区间)两种形式,遵循左闭右开原则。JDK6存在内存泄漏问题,因复用原字符数组;JDK7+优化为创建新数组,避免内存隐患。字符串不可变,方法返回新字符串。使用时需注意参数合法性,避免StringIndexOutOfBoundsException异常。
2026-01-06 11:35:00
313
原创 StringBuffer & StringBuilder 完全讲解
摘要:StringBuffer和StringBuilder都是Java中用于高效字符串操作的可变字符序列类,核心区别在于线程安全性。StringBuffer是线程安全的(方法使用synchronized修饰),适合多线程环境;StringBuilder线程不安全但效率更高,适合单线程场景。两者提供相同的API(如append、insert等),底层都使用可扩容char[]数组实现原地修改。开发选型建议:单线程优先用StringBuilder,多线程用StringBuffer,字符串内容固定时用String。
2026-01-06 11:12:31
662
原创 力扣349. 两个数组的交集
本文介绍了两种求解数组交集的算法。第一种使用HashSet,通过将第一个数组存入集合实现去重,再遍历第二个数组查找共同元素,时间复杂度O(m+n),空间复杂度O(min(m,n))。第二种采用排序加双指针,先对数组排序,然后用双指针遍历比较元素,时间复杂度O(mlogm+nlogn),空间复杂度O(1)。HashSet解法适合新手,易于实现;双指针方法更节省空间,适合有空间限制的场景。两种方法都能有效解决数组交集问题,需根据实际需求选择。
2026-01-05 15:05:03
121
原创 力扣350. 两个数组的交集 II
本文介绍了求解两个数组交集的两种方法。第一种使用哈希表统计较短数组元素出现次数,然后遍历较长数组匹配元素,时间复杂度O(m+n),空间复杂度O(min(m,n))。第二种采用排序后双指针遍历的方式,时间复杂度O(mlogm+nlogn),但空间复杂度为O(1),适合空间受限场景。两种方法都能正确处理元素重复次数问题,根据实际需求选择使用:哈希表法适合追求时间效率,双指针法适合空间受限情况。
2026-01-05 14:31:04
299
原创 力扣 268. 缺失数字 ✅ 【位运算(异或)最优解法】深度解析
摘要:本文提出利用异或运算求解缺失数字的最优解法。该算法通过将完整序列(0~n)与残缺数组(nums)的所有元素异或,利用异或性质a^a=0和0^a=a,使成对数字抵消后剩余值即为缺失数。相比求和法,异或解法时间复杂度O(n)、空间复杂度O(1),且无数值溢出风险,运算效率更高。核心优势包括:避免大数溢出、位运算高效执行、适用于各类找缺失/重复数字问题。通过实例验证和性质推导,证明该方法是力扣268题的最优解决方案。
2026-01-04 17:12:23
344
原创 彻底讲透✅ 二分「准确查找 」→「边界查找」+「升序 / 降序区分」
摘要 二分查找可分为「准确查找」和「边界查找」两种模式。准确查找(如704题)直接匹配目标值,找到即返回;边界查找(如2529/1351题)则寻找满足条件的第一个位置,必须遍历到区间为空,最终返回left。核心区别在于:准确查找中途可终止,边界查找必须完整遍历。 升序与降序数组的边界查找存在镜像关系:升序中满足条件时收缩右边界(right=mid-1),降序中则收缩左边界(left=mid+1),但循环条件和返回规则保持一致。掌握这一规律可高效解决各类边界查找问题。
2026-01-04 16:01:08
312
原创 力扣 209. 长度最小的子数组:滑动窗口解法完整解析
本文介绍了一种使用滑动窗口(双指针)算法解决"最小长度连续子数组和≥目标值"问题的方法。该算法通过动态调整窗口边界,在O(n)时间内高效求解,相比暴力法的O(n²)更优。核心步骤包括:右指针扩张窗口求和,当和≥目标值时左指针收缩窗口并记录最小长度。文章详细解析了代码实现,包括变量初始化、窗口调整逻辑和边界条件处理,并通过示例验证算法正确性。最后指出可通过优化初始值减少变量使用,并强调该算法适用于多种数组区间问题。
2025-12-01 09:37:16
925
原创 力扣 128. 最长连续序列:HashSet 优化,O (n) 解法详解
本文介绍了力扣128题"最长连续序列"的O(n)解法。通过HashSet去重存储数组元素,并寻找连续序列起点(即前驱不存在的数字),然后统计以该起点开始的最长连续序列长度。这种方法避免了排序的O(nlogn)复杂度,通过HashSet的O(1)查找特性,确保每个元素最多被访问两次,最终实现O(n)时间复杂度和O(n)空间复杂度的最优解。该解法巧妙地利用"起点判定"避免重复统计,是处理数组连续序列问题的经典思路。
2025-11-26 18:30:59
437
原创 力扣 49. 字母异位词分组:哈希表 + 特征提取的高效解法
本文分享了力扣第49题"字母异位词分组"的解题思路。通过分析暴力解法的局限性,提出核心解决方案:利用排序生成统一特征键,结合哈希表实现高效分组。文章详细介绍了排序法代码实现,包括特征键生成和哈希表操作,并分析了时间复杂度(O(n×mlogm))和空间复杂度(O(n×m))。最后指出这种"特征提取+哈希表映射"的思路可应用于多种分组问题,并建议进一步优化的方向(如字符计数法)。该解法有效解决了字母异位词识别和分组的关键问题。
2025-11-25 16:36:04
894
原创 力扣 1. 两数之和:哈希表的高效解法
本文分享了力扣经典算法题"两数之和"的解题思路。首先分析暴力解法的时间复杂度问题(O(n²)),然后提出使用哈希表优化的方法,将查找效率提升至O(1)。详细讲解了哈希表法的实现过程:通过一次遍历数组,利用哈希表存储已遍历元素及其下标,快速查找目标补数。最终方案的时间复杂度为O(n),空间复杂度O(n),是效率最优的解决方案。这道题体现了从暴力枚举到高效查找的算法优化思想,其核心方法可应用于多种查找匹配问题。
2025-11-25 15:08:34
639
原创 力扣 977. 有序数组的平方:双指针法的优雅解法
本文分享了力扣977题"有序数组的平方"的解题思路。首先分析暴力解法(平方后排序)的局限,其时间复杂度为O(nlogn)。基于数组有序的特性,提出更优的双指针解法:从数组两端向中间遍历,比较两端元素的平方值,将较大值从结果数组末尾开始填充。这种方法时间复杂度降为O(n),空间复杂度为O(n)。该思路适用于多种有序数组问题,如两数之和、合并有序数组等。文章详细解析了双指针法的实现代码和复杂度分析,帮助读者掌握"有序数组+双指针"的解题技巧。
2025-11-25 09:46:27
317
原创 二叉树后序遍历:递归实现与核心逻辑解析
本文详解二叉树后序遍历的递归实现,重点解析其"左→右→根"的访问顺序及其应用场景。通过修正C++代码示例,阐明后序遍历必须严格遵循先处理子树再访问根节点的原则,特别适合需要"自底向上"处理的场景(如节点删除、路径计算等)。文章剖析了递归实现的优势(逻辑清晰)与局限(栈溢出风险),并指出引用传递优化等关键细节。后序遍历的"先子后根"特性体现了二叉树处理的重要思想,为后续学习迭代实现奠定基础。
2025-11-24 14:55:18
327
原创 二叉树中序遍历:递归实现与核心逻辑解析
本文详细解析了二叉树中序遍历的递归实现方法。中序遍历遵循"左子树→根节点→右子树"的顺序,对于二叉搜索树能产生有序序列。文章通过C++代码示例展示了递归实现过程,重点分析了递归终止条件、执行顺序和引用传递等关键细节。中序遍历在二叉搜索树验证和有序序列提取中有重要应用。递归实现虽然代码简洁,但存在栈溢出风险。理解这一方法有助于掌握二叉树结构和递归思想,为进一步学习迭代实现或Morris遍历打下基础。
2025-11-24 11:47:32
315
原创 二叉树前序遍历:递归实现与原理详解
本文介绍了二叉树前序遍历的递归实现方法。前序遍历遵循"根-左-右"的顺序访问节点,递归实现通过函数调用栈模拟遍历过程。代码示例展示了如何定义递归终止条件(遇到空节点)和严格执行访问顺序。关键点包括:使用引用传递避免容器拷贝、正确处理空指针、严格保持遍历顺序。递归实现具有代码简洁的优点,但也存在栈溢出风险。理解这种"分治"思想是掌握二叉树遍历的基础。该算法对应力扣第144题。
2025-11-23 11:23:24
376
原创 二分查找:从原理到实现的极简探索
本文介绍了二分查找算法的核心原理与实现细节。该算法通过分治策略将时间复杂度优化至O(logn),适用于有序数组的静态查找。关键实现要点包括:采用闭区间定义确保元素完整检查、使用mid=left+(right-left)/2防止整数溢出、通过边界收缩避免死循环。文章提供了可直接应用于LeetCode704等问题的完整代码实现,并指出该算法在动态数据场景中的局限性。二分查找的精髓在于"减而治之"的分治思想,是算法学习中的重要基础。
2025-11-23 10:27:15
676
原创 数据结构之链栈
链栈是一种基于链表结构实现的栈,栈是一种具有后进先出(LIFO)特性的数据结构,只允许在栈顶进行插入(入栈)和删除(出栈)操作。
2024-02-08 16:53:30
1199
原创 数据结构之栈
栈(Stack)是一种常见的数据结构,它遵循后进先出(Last In, First Out,LIFO)的原则。也就是说,最后入栈的元素将首先被弹出。栈常常被用于需要临时保存数据并按照特定顺序访问数据的场合,例如表达式求值、函数调用、括号匹配等。
2024-02-04 16:44:09
783
1
空空如也
关于#数据库#的问题,如何解决?
2022-09-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅