- 博客(21)
- 收藏
- 关注
原创 算法训练day21/227.基本计算器 ll
我通过 “乘除优先计算、加减符号入栈” 的思路,巧妙解决了四则运算的优先级问题:遇到乘除时直接与栈顶元素运算,遇到加减则将数字带符号存入栈中,最后统一求和。这种方法不仅保证了计算顺序的正确性,也实现了线性时间复杂度,逻辑清晰高效。解题过程中,我也注意到了多位数拼接、空格处理和除法向零截断等细节问题,锻炼了自己处理边界条件的能力。这道题让我体会到,栈不仅能处理简单的匹配问题,还能通过灵活的策略解决带优先级的复杂计算场景,加深了我对数据结构应用的理解。第四步遇到运算符 / 结尾,开始计算。
2026-05-03 20:13:06
9
原创 算法训练day20/150.逆波兰表达式求值
利用栈 “先进后出” 的特性,我们可以很自然地处理后缀表达式的运算顺序,遇到数字就压入栈中;遇到运算符,则弹出栈顶的两个数进行计算,再将结果压回栈中。这种方式不仅保证了运算顺序的正确性,也实现了 O (n) 的线性时间复杂度,效率很高。第五步遇到数字直接入栈,最后返回栈里的结果。是后压进去的(先弹出),是右操作数。是先压进去的(后弹出),是左操作数。:栈顶先 + 1,再把数字放进去。中的一个,说明是运算符。:保证只有一个字符,是。第一步定义栈和栈顶,:表示栈现在是空的。
2026-05-02 20:16:53
13
原创 算法训练day19/1047.删除字符串中的所有相邻重复项
利用栈 “先进后出” 的特性,只需一次遍历,就能自动处理所有相邻重复项,包括删除后新产生的重复对,避免了多次循环,时间复杂度为 O (n)。解题中需要注意栈空的边界判断,以及为结果字符串添加结束符,防止越界访问。第四步和栈顶比较,相同删掉,栈顶不同入栈。第三步写for循环遍历每个字符。第二步创建栈,用来存最终结果。第五步加结束符,返回结果。第一步得到字符串长度。
2026-05-01 20:40:52
14
原创 算法训练day18/20.有效的括号
利用栈先进后出的特点,能够很好解决括号嵌套和顺序匹配的问题。解题中遵循左括号入栈、右括号与栈顶元素比对匹配的思路,逻辑清晰易懂。同时我也认识到边界条件的重要性,出现右括号但栈为空、遍历结束后栈还有剩余元素,都属于括号不合法的情况。第一步求字符串长度,定义栈和栈顶指针。第二步写for循环遍历每个字符。第三步用if,左括号入栈。第三步右括号判断匹配。最后判断栈是否为空。
2026-04-30 20:33:31
15
原创 算法训练day17/151.反转字符串中的单词
先只保留一个空格写到 j 位置,然后跳过后面连着的所有多余空格,i 直接跳到下一个单词开头。通过学习该代码,我掌握了双指针、分步骤解题技巧,理解了原地修改思路,认识到编程细节与逻辑严谨性的重要性,提升了自身编程思维。i 是读指针,从头往后遍历原字符串,j 是写指针,把干净无多余空格的字符,重新写回数组前面,原地覆盖,不新开数组,省空间。存左边字符,把右边字符赋值给左边位置,把临时变量里原来的左边字符,赋值给右边位置,完成两个字符互换。左边指针往右走一格,右边指针往左走一格,慢慢向中间靠拢,直到相遇。
2026-04-29 20:13:04
150
原创 算法训练day16/541.反转字符串 ll
第二步写 “反转一段字符串” 的逻辑 我们需要一个小功能:给一段字符串的左右下标,把这段反转过来。比如 s = "abcd", left=0, right=1 → 反转后变成 "bacd"。代码逻辑: 左右两个指针,交换位置上的字符。左指针右移,右指针左移,直到相遇。第一步获取字符串长度,写循环分段,我们需要先知道字符串有多长,然后按。做好边界控制和巧用双指针算法。最后把全部拼在一起就做完了。
2026-04-28 14:56:18
13
原创 算法训练day15/344.反转字符串
第三部在while循环里面交换,交换左右两个字符,然后左边往右走,右边往左走。第一步定义两个指针,一个在最左边,另一个在最右边。第二步写while循环,只要。,就说明还没到中间,继续交换。
2026-04-27 20:47:26
16
原创 算法训练day14/18.四数相加
有序数组不仅能方便快速去重,避免出现重复答案,还能让双指针的移动逻辑成立,通过数值大小灵活调整指针位置,大幅降低时间复杂度,比暴力四层循环高效很多。第六步,三种情况判断,四数和 等于 target(找到答案),和太小,左指针右移,,和太大,右指针左移,最后返回答案。第一步写排序比较函数,做边界判,数组不够 4 个数,直接返回空。第五步用left和right指针找后面两数,接到j循环里面。第三步写第一个循环固定第一个数i,同时去重。第四步写第二个循环固定第一个数j,同时去重。第二步数组排序,开辟空间存答案。
2026-04-26 22:21:15
17
原创 算法训练day13/454.四数相加 ll
让我深刻体会到“化繁为简”在编程中的重要性。一开始看到“四数相加等于0”的题目,我第一反应是用四重循环逐个尝试,却没想到这样会导致效率极低,而通过分组和哈希表的思路,能轻松将复杂问题简化,这也让我对编程解题有了新的认知。第三步,写第二个双重for循环,算数组3和数组的所以数字两两相加,取反,去前面的记录里找,找到几次,答案就加几次。我们用最简单的哈希表和分组解法,第一步,定义两变量,哈希表来记录数组相加之和,res来记最后答案。第二步,写第一个双重for循环,算数组1和数组2的所以数字两两相加。
2026-04-25 21:14:20
14
原创 算法训练day12/169.多数元素
我们使用摩尔投票法来写这道题,第一步定义两个变量,candidate = 存当前最有可能的答案,count = 给答案记票数。第四步,写if判断,和答案一样 → 支持它,票 + 1,和答案不一样 → 反对它,票 - 1,循环结束,返回答案。我新了一种方法,摩尔投票法,在编写代码过程中,我理解了双变量配合使用的逻辑。第三步用if来判断,如果票数为零,就换答案。第二步写if循环遍历数组。
2026-04-24 20:51:34
14
原创 算法训练day11/80.删除有序数组中的重复项 II
第三步用if来判断,数组要不要保留,只要当前数字 = 有效数组倒数第二个数字就说明这个数字可以保留。把要的数字放进去,长度+1,返回最终有效长度。第二步定义双指针,slow:记录有效数组的长度,fast:用来遍历整个数组,因为前两个数字一定保留,所以都从。第一步先想边界情况,如果数组长度 ≤ 2,不管是什么数字,都直接返回原长度。因为题目允许最多出现 2 次。更深刻、熟练的学习了双指针。
2026-04-23 14:15:50
16
原创 算法训练day10/26.删除有序数组中的重复项
从 0 开始,指向数组第一个元素,它代表的是去重后数组的最后一个元素的位置。然后写for循环遍历数组,fast和slow 指向的元素对比,找到不重复的新元素。最后再嵌套一个for循环,如果。第一步做边界处理,如果数组是空的,直接返回零,避免出错。位置,这样就完成了一次 “去重” 操作。最后一步,返回结果,数组等于索引加一。不相等,说明这是一个新的不重复元素。,先往后挪一位,把新元素放到。第二步初始化指针,让。
2026-04-22 20:50:34
14
原创 算法训练day9/1.两数之和
第二步写for循环去算全部结果,需要两层for循环,分别代表两个相加的数,等之和是想要的数字就找到了,记录他们的下标,这题就做完了。本题我采用最简单直接的暴力拆解,把全部试出来。第一步返回两个下标,申请存两个数字的空间。学会了在遍历数组中采用双循环的暴力算法。
2026-04-21 14:12:29
14
原创 算法训练day8/.88合并两个有序数组
从前往后会覆盖数据,从后往前不会覆盖,所以我们从后往前写。第一步先定义i,j,k,i 指向 nums1 最后一个数字,j 指向 nums2 最后一个数字,k 指向 nums1 最后一个空位。第三步在while中写if来判断数组的大小,大的放到k,数组也要往前走一个,同时放完一个,空位往前挪一个。最后一步,写while循环,因为可能会出现nums1 已经放完了,但 nums2 还剩好几个数字。第二步写while循环,让i,j只要还有数字就继续比较。就把剩下的数字一个一个全部放进nums1前面空位。
2026-04-20 20:09:15
12
原创 算法训练day7/142.环形链表 ll
第四步找环入口,只要快慢指针相遇,立刻再弄一个指针从头走,和慢指针一起走,相遇就是环入口。这道题目我采用快慢双指针来写,第一步写快慢指针,快指针一次走两步,慢指针一次走一步。第三步在while循环中,让快慢指针走起来,用if语句来判断是否相遇,相遇就是有环。第二步用while循环找相遇点,快指针没走到头,就继续走。第五步,如果循环跳出就是说明没环。一次新的逻辑快慢双指针的使用。
2026-04-19 21:08:04
23
原创 算法训练day6/206.反转链表
链表反转的本质不是移动节点的值,而是改变每个节点的 next 指针方向,让原本指向下一个节点的指针,转而指向前一个节点,从而实现整个链表顺序颠倒。prev = NULL 第一个节点反转后会变成尾节点,它的 next 必须指向 NULL,所以初始前一个节点是 NULL。第二步写while循环,处理每个节点,只要当前节点不为空,就继续处理,直到遍历完整个链表。第三步在while循环里面写,保存下一个节点,反转当前节点的指针,next 先不赋值,每轮循环里再存值,用来临时保存下一个节点。第一步初始化3个指针。
2026-04-18 21:05:06
14
原创 算法训练day5/203.移除链表元素
第二步,用while循环来检查每个节点,再用if语句来判断是否删除,如果不要就继续往前走。第一步,创建虚拟头节点,统一处理头节点被删除的情况,定义遍历指针,从dummy开始。学会虚拟头节点,事倍功半。
2026-04-17 15:53:50
15
原创 算法训练day4/59.螺旋矩阵
第四步在循环填充中,编写for循环,分别是。第三步写循环填充,没有满就一直转。第二步设置四个边界和起始数字。第一步创建空矩阵,申请内存。做好边界控制,理清循环逻辑。从左到右,填矩阵上边;从上到下,填矩阵右边;从右到左,填矩阵下边;从下到上,填矩阵左边;
2026-04-16 20:16:27
18
原创 算法训练day3/209.长度最小的子数组
第三步只要sum ≥ target,我们就尝试缩小左边,看看能不能更短。最后判断找到 → 返回 minLen,没找到 → 返回 0,这样我们就完成了这道题。滑动窗口的本质也也是双指针,与昨天内容有点关联,for循环来缩小。第二步右指针遍历整个数组,右边一直往右走,把数字加进窗口。我采用双指针来写,第一步定义 4 个关键变量,:存答案,找不到就返回 0;:窗口里所有数加起来;
2026-04-15 20:35:50
15
原创 算法训练day2/27.移除元素
第四步将数字放到慢指针的位置,随后慢指针往后挪一位,准备存下一个,遍历结束返回慢指针。我采用快慢双指针来写,第一步定义慢指针,从零开始。第二步用快指针遍历整个数组,一个一个检查元素。这样我们就用快慢指针完成这道题目。用快指针遍历,将不需要放慢指针。
2026-04-14 14:36:02
27
原创 算法训练day1/704.二分查找
我采用左闭右闭区间来写,第一步定义左右指针,初始化区间。第四步循环结束,没找到就返回 - 1。第二步写循环条件,持续缩小区间。第三步计算中间位置,比较目标值。要理解区间的定义,做好边界处理。这样就做完了这道题目。
2026-04-13 12:45:54
40
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅