代码随想录算法训练营day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

栈与队列part02(24.01.06)

安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。


  • 学习时长:2h
  • 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
  • 学习感悟:用栈解题的思路好好玩啊也很好理解,明白基本原理去pdf里看相应语言的代码实现即可,每天解决任务的速度越来越快了!

20. 有效的括号

题目链接:力扣题目链接

笔记

        1.不匹配类型只有三种:左括号多了(遍历完了但栈非空),左右括号类型不匹配(匹配过程中发现和栈中弹出元素不同),右括号多了(还没遍历完但栈空了)

        2.遍历,遇左括号进栈,遇右括号弹出比较。注意进栈时放相应类型的右括号,方便后续弹出直接比较。

提交代码:

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for item in s:
            if item == '[':
                stack.append(']')
            elif item == '(':
                stack.append(')')
            elif item == '{':
                stack.append('}')
            elif not stack or stack[-1] != item: #对应右括号多了或者左右不匹配
                return False
            else:
                stack.pop()
        return True if not stack else False #对应左括号多了

1047. 删除字符串中的所有相邻重复项

题目链接力扣题目链接

笔记:

        类似上一题的思路,利用栈做一个对比消除的操作。但具体来讲不是使用栈,而是使用一个列表来模拟栈的操作。由于字符串不能直接处理,我们利用列表进行拼接。

提交代码:

class Solution:
    def removeDuplicates(self, s: str) -> str:
        res = list()
        for item in s:
            if res and item == res[-1]:
                res.pop()
            else:
                res.append(item)
        return "".join(res)

150. 逆波兰表达式求值

题目链接:力扣题目链接

笔记:

        1.逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

        2.逆波兰表达式主要有以下两个优点

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

  • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

        3.解题思路其实就是:遍历到数字就把它放入栈中,遍历到符号就从栈中拿出两个数字进行对应的符号运算,得到的新的数字放入栈中,继续遍历,直到遍历结束。

        4.下面这段代码创建了一个字典 op_map,其中包含四个键值对,每个键表示一个运算符,而对应的值则是一个函数或 lambda 表达式。这样的设计通常用于实现一个简单的计算器,可以根据给定的运算符执行相应的操作。其中:'/': 对应一个匿名的 lambda 表达式,表示除法操作。这个 lambda 表达式接受两个参数 xy,执行的操作是返回 x / y 的整数部分,即整数除法。

op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}

提交代码:

from operator import add, sub ,mul

class Solution:
    opt_map = {'+':add,'-':sub,'*':mul,'/':lambda x,y :int(x/y)}
    
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token not in {'+','-','*','/'}:
                stack.append(int(token))
            else:
                opt2 = stack.pop()
                opt1 = stack.pop()
                stack.append(self.opt_map[token](opt1,opt2))
        return stack.pop()

过程中报错:

        1.输入stack.append(opt_map[token](opt1,opt2))时会报错:NameError: name 'opt_map' is not defined 。解决办法是修正为:stack.append(self.opt_map[token](opt1,opt2))

        2.输入if token not in {'+','-','*','/'}:stack.append(token)会报错:TypeError: can't multiply sequence by non-int of type 'str';这是因为字符串之间无法进行运算,这个错误通常发生在尝试用一个字符串(str)去乘以非整数类型的对象时。在 Python 中,你只能将字符串与整数相乘,表示重复字符串多次。 解决办法是修正为:stack.append(int(token))

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值