【代码随想录】d11-栈与队列-part02-python

1.20. 有效的括号

1.1题目及讲解

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

1.2代码实现

s = "()[]{}"
def fun():
	#如果为奇数个括号,那一定有无法匹配的
    if len(s)%2 != 0:
        return False
    dic = {'(': ')', '{': '}', '[': ']'}
    lis = []
    for i in s:    # 遍历字符串
        if i in dic.keys():  # 如果是左括号
            lis.append(dic[i])  # 那么就在栈中加入右括号
        elif not lis or lis[-1] !=i:  # 如果遍历过程中栈为空了,说明右括号多了;如果遍历的元素和栈顶元素不相等,说明括号类型不匹配
            return False
        else:
            lis.pop()
    return False if lis else True  # 遍历完后,栈应该为空,不为空说明左括号多了

print(fun())

分析:
括号不匹配一共有三种情况:

  1. 左方向的括号多余了 ,所以不匹配
    已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
    【代码随想录】d11-栈与队列-part02-python_第1张图片
  2. 括号没有多余,但是 括号的类型没有匹配上
    遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
    【代码随想录】d11-栈与队列-part02-python_第2张图片
  3. 字符串里右方向的括号多余了,所以不匹配
    遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
    【代码随想录】d11-栈与队列-part02-python_第3张图片
    全部匹配的场景:
    字符串遍历完之后,栈是空的,就说明全都匹配了。

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

2.1题目及讲解

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

2.2代码实现

与上一题实现方法基本一致

s ="aa"
def fun():
    lis = []
    for i in s:
        if lis and lis[-1]==i:  # 如果lis不为空且出现与栈顶字符相同的字符,那么就从栈中把这个字符删除
            lis.pop()
        else:
            lis.append(i)  # 否则就把字符加到栈中
    return ''.join(lis)

print(fun())

3.150. 逆波兰表达式求值

3.1题目及讲解

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:

  • 有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html

3.2代码实现

tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]

def fun():
    lis = []
    for i in range(len(tokens)):
        if tokens[i] == '+':
            a = lis.pop()
            b = lis.pop()
            lis.append(int(a) + int(b))
        elif tokens[i] == '-':
            b = lis.pop()
            a = lis.pop()
            lis.append(int(a) - int(b))
        elif tokens[i] == '*':
            a = lis.pop()
            b = lis.pop()
            lis.append(int(a) * int(b))
        elif tokens[i] == '/':
            b = lis.pop()
            a = lis.pop()
            lis.append(int(int(a) / int(b)))
        else:
            lis.append(tokens[i])
    return lis[0]

print(fun())

简化代码实现:

from operator import add, sub, mul
op_map = {'+': add,'-': sub, '*': mul,'/':lambda x,y:int(x/y)}
tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]


def fun():
    lis = []
    for i in range(len(tokens)):
        if tokens[i] not in ('+', '-', '*', '/'):
            lis.append(int(tokens[i]))
        else:
            b = lis.pop()
            a = lis.pop()
            # 算数运算简化
            lis.append(op_map[tokens[i]](a,b))
    return lis[0]

print(fun())

总结:

  1. 算数运算可以通过operator库中的各种方法进行简化
  2. 在判断是否等于一些字符时,in可以in ('+', '-', '*', '/') 的形式
  3. 负数计算除法时,如果只取整数部分,应该在最外面加上int,如果直接使用//整除,计算结果是不同的(整除无法取比结果更大的值)
print(6/-132)  # 结果为 -0.045454545454545456
print(6//-132) # 结果为 -1
print(int(6/-132)) # 结果为 0

你可能感兴趣的:(python,leetcode)