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

154 阅读3分钟

20. 有效的括号 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

搞个栈,只压左括号, 遇到右括号就弹栈,

  1. 如果弹出的字符与右括号不匹配,或者为空,那就返回false
  2. 否则就继续遇到左括号就压栈,遇到右括号就弹栈。

如果过程中没有返回false,那么就说明是匹配的,我们直接return true

class Solution:
    def isValid(self, s: str) -> bool:
        match_dict = {
            ')': '(',
            ']': '[',
            '}': '{'
        }
        stack = list()
        s_list = list(s)
        for s_char in s_list:
            if s_char in match_dict.keys():
                if stack:
                    left_char = stack.pop()
                    if match_dict[s_char] == left_char: 
                        continue
                    else:
                        return False
                else:
                    return False
            else:
                stack.append(s_char)
        if stack:
            return False
        return True

3. 看完代码随想录之后的想法

跟字典实现的方法没有区别,无非是我存的是本身的左括号,他存的是左括号对应的右括号。

4. 实现过程中遇到的困难

无。

5.学习时长

30分钟

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

还是构造一个栈,

每次遍历一个字符时,先判断栈顶元素是否与之相同:

  1. 如果相同,出栈,进行下一个字符的遍历。
  2. 如果不同,压栈,将当前字符压栈。

所有字符遍历完成后结束。

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

3. 看完代码随想录之后的想法

和用栈实现的思路是一样的。

4. 实现过程中遇到的困难

无。

5.学习时长

20分钟

150. 逆波兰表达式求值 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

向0截断的除法应该是计算机底层对除法就这么实现吧,我都CS APP的常数除法是这样的,所以不用管。

逆波兰式遇见符号就算栈里两个操作数的计算结果,然后压入栈里。

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        cache_stack = list()
        for char in tokens:
            if char == '+':
                r1 = cache_stack.pop()
                r2 = cache_stack.pop()
                r3 = r1 + r2
                cache_stack.append(r3)
            elif char == '-':
                r1 = cache_stack.pop()
                r2 = cache_stack.pop()
                r3 = r2 - r1
                cache_stack.append(r3)
            elif char == '*':
                r1 = cache_stack.pop()
                r2 = cache_stack.pop()
                r3 = r1 * r2
                cache_stack.append(r3)
            elif char == '/':
                r1 = cache_stack.pop()
                r2 = cache_stack.pop()
                r3 = int(r2 / r1)
                cache_stack.append(r3)
            else:
                cache_stack.append(int(char))
        return cache_stack.pop()

3. 看完代码随想录之后的想法

与我的想法一致。

4. 实现过程中遇到的困难

这个除法向0截断用的是int(a/b)不能用a//b。

在Python中,a // bint(a / b) 都可以用来执行整数除法。不过,它们在处理负数除法时的行为有所不同。

  • a // b 是向下取整,也就是向负无穷大的方向取整。当 a 是正数,b 是负数时,结果会向更负的方向取整。
  • int(a / b) 是向零取整,也就是向0的方向取整。无论 a 是正数还是负数,b 是正数还是负数,结果总是向0的方向取整。

这就能解释 6 / -132 的情况:

  • 使用 6 // -132 得到的结果是 -1,因为它向负无穷大的方向取整。
  • 使用 int(6 / -132) 得到的结果是 0,因为它向零的方向取整。

所以,如果你希望除法向0截断,你应该使用 int(a / b) 而不是 a // b

5.学习时长

20分钟。