自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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关注的人

提示
确定要删除当前文章?
取消 删除