刷题day(9) | 代码随想录

47 阅读1分钟

本系列文章是我刷代码随想录过程中的笔记。代码地址:leetcode

今天是我刷“代码随想录”的第九天

今日内容

  • 20.有效的括号
  • 1047.删除字符串中的所有相邻重复项
  • 150.逆波兰表达式求值

leetcode 20. 有效的括号

简单题,用一个字典记录左括号对应的右括号的值。遍历字符串。遇到左括号就将对应的右括号放入栈中,遇到右括号就判断是否与栈顶元素相同。如果不相同,直接返回false,如果相同,弹出栈顶元素,继续遍历。最后返回栈是否为空。

class Solution:
    def isValid(self, s: str) -> bool:
        l = []
        d = {
            "(": ")",
            "[": "]",
            "{": "}"
        }
        for i in s:
            if i in d.keys():
                l.append(d[i])
            else:
                if not l: return False
                if i == l[-1]:
                    l.pop(-1)
                else:
                    return False
        return len(l) == 0

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

遍历字符串,如果栈为空或者栈顶元素与当前遍历元素不相同,将该元素添加进栈中,反之,直接跳过。最后将栈中的元素拼成字符串。

class Solution:
    def removeDuplicates(self, s: str) -> str:
        l = []
        for i in s:
            if not l or l[-1] != i:
                l.append(i)
            else:
                l.pop(-1)
        return "".join(l)

leetcode 150. 逆波兰表达式求值

这道题要注意的是前面的数+-*/后面的数。而弹出的时候时先后后前。遍历列表,碰到操作符弹出栈顶的元素,碰到数字就添加进栈中

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        l = []
        for i in tokens:
            if i == "+":
                a = l.pop()
                b = l.pop()
                l.append(b + a)
            elif i == "-":
                a = l.pop()
                b = l.pop()
                l.append(b - a)
            elif i == "*":
                a = l.pop()
                b = l.pop()
                l.append(b * a)
            elif i == "/":
                a = l.pop()
                b = l.pop()
                l.append(int(b / a))
            else:
                l.append(int(i))
        return l[0]