给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
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())
分析:
括号不匹配一共有三种情况:
给出由小写字母组成的字符串 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
与上一题实现方法基本一致
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())
给你一个字符串数组 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
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())
总结:
in ('+', '-', '*', '/')
的形式print(6/-132) # 结果为 -0.045454545454545456
print(6//-132) # 结果为 -1
print(int(6/-132)) # 结果为 0