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

文章讨论了栈在解决编程问题中的应用,如括号匹配、删除字符串相邻重复项和逆波兰表达式求值。通过使用栈,可以巧妙地处理元素的顺序关系和匹配问题。文章提到了具体的问题解决方案和代码实现,并对比了不同解题思路的效率。
摘要由CSDN通过智能技术生成

总结

1.栈用在括号匹配,括号左右不想等,用栈匹配很巧妙
2.在循环字符串时:可以考虑利用:for each_s in s:形式,会节省代码行数
3.在进行重复删除,逆波兰都会用到栈,找到其中的共性就是,在遍历一边字符串时,被遍历过了元素也要被重复使用,而且重复使用的元素通常来说都是被操作元素的前一个元素,例如abbaca,要删除bb,之后就又是开头的a被利用,此时就要考虑栈,栈的特性就是先进后出

20. 有效的括号

题目链接:

leecode—括号匹配

自己想

1.想不出来,想不出来的原因在于由于要比较的左括号和右括号对应相等,但是不能简单用==号比较

看完题解

1.利用入栈,对应元素去判断,比如字符串搜索到’[',就将‘]’入栈,这个想法很巧妙,但是要想到这个解决办法的前提是是能将问题抽象成入栈出栈,才会考虑用这个方法
2.我看完题解思路写的答案是:我们用了两种不同策略,我感觉这个都行,没有谁比谁丝滑

            elif len(ls) == 0: return False
            elif len(ls) != 0 and ls.pop() != each_s:
                return False

而官方给出的答案却利用or:

            elif not stack or stack[-1] != item:
                return False
            else:
                stack.pop()
完整代码
class Solution:
    def isValid(self, s: str) -> bool:
        n = len(s)
        ls = []
        if n%2 != 0:
            return False
        
        for each_s in s:
            if each_s == '[': ls.append(']')
            elif each_s == '{': ls.append('}')
            elif each_s == '(': ls.append(')')
            elif len(ls) == 0: return False
            elif len(ls) != 0 and ls.pop() != each_s:
                return False

        if len(ls) != 0:
            # print(2)
            return False
        

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

题目链接:

leecode-相邻重复项

自己想

1.应该是用栈,所以就是用一个栈来存放遍历过的元素

看完题解

1.看到题解也是用栈存放,但是题解答案写的及其剪短

自己认为代码之所以冗余,关键在于循环判断,直接用for item in s:其实就回简单很多

        res = list()
        for item in s:
            if res and res[-1] == item:
                res.pop()
            else:
                res.append(item)
        return "".join(res)  # 字符串拼接
完整代码(自己写的有点长)
class Solution:
    def removeDuplicates(self, s: str) -> str:

        s1 = []
        s = list(s)
        while(s):
            if len(s1) == 0:
                 s1.append(s.pop())
            elif s[-1] != s1[-1]:
                s1.append(s.pop())
            elif s[-1] == s1[-1]:
                s.pop()
                s1.pop()
        s1.reverse()
        s1 = ''.join(s1)
        return s1

150. 逆波兰表达式求值

题目链接:

leecode_逆波兰表达式求值

自己想

1.利用栈进行计算,leecode给出了提示

看完题解

1.题解思路与自己差不多,但是代码引入了

from operator import add, sub, mul

同时还使用了一个哈希

出现问题

看完题解与自己对比
1.注意到在进行除法运算,除数和被除数是有顺序区别的,减法也是
2.在自己调试代码时,发现使用//,对于负数会向下取整,于是对于负数结果用了ceil函数,但实际上不需要区分是否为负数,直接使用int(b/a)即可

完整代码
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        s1 = []
        for each_token in tokens:
            if each_token == "+":
                
                c= s1.pop() + s1.pop()
                s1.append(c)
            elif each_token == "-":
                c= -(s1.pop() - s1.pop())
                s1.append(c)
            elif each_token == '*':
                c = s1.pop() * s1.pop()
                s1.append(c)
            elif each_token == '/':
                a = s1.pop()
                b = s1.pop()
                c = int(b/a)#我以前写的引入别的库函数,为了在负数的时候也向0取整,直接用这个即可
                s1.append(c)
            
            else:
                s1.append(int(each_token))

        return(s1.pop())
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值