有效的括号
题目链接
题目不难,想到用栈来解决思路很清晰,把左括号都入栈,遇到右括号就pop出一个作对应,若能对应则继续,不能对应则说明字符串括号不对应返回False
但是有些细节很容易想不到,debug三次才过
首先忽略了最后需要判断栈为空才说明括号都对上了
其次忽略了没有左括号,栈无法pop出元素报错的情况
class Solution:
def isValid(self, s: str) -> bool:
str1 = list(s)
stack = []
for i in str1:
if i in ['(','[','{']:
stack.append(i)
elif i in [')',']','}']:
if len(stack) == 0:
return False
temp = ord(stack.pop())
if abs(ord(i) - temp) <= 2:
continue
else:
return False
if len(stack) == 0:
return True
else:
return False
看一下解答,栈非常适合做对称匹配类问题
没有把三种不匹配的情况捋得很清楚
并且可以在遇到左括号时直接入栈右括号,然后判断是否相等即可,不需要用ord取ASCII码来判断括号是否对应
而且还可以使用字典来做对应判断
删除字符串中的所有相邻重复项
题目链接
同样地,使用栈题目不难,不过写完居然耗时很长?
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
if i not in stack:
stack.append(i)
elif i != stack[-1]:
stack.append(i)
else:
stack.pop()
return ''.join(stack)
解答还给了不使用栈的双指针法,非常巧妙,让慢指针前一个与其相同时回退指针,从而跳过相同的元素
逆波兰表达式求值
题目链接
只要了解后缀表达式此题就不难,不过还是忽略了一种字符串中只有一个数字的情况
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i not in ['+','-','*','/']:
stack.append(i)
else:
num2 = int(stack.pop())
num1 = int(stack.pop())
if i == '+':
stack.append(num1+num2)
elif i == '-':
stack.append(num1-num2)
elif i == '*':
stack.append(num1*num2)
elif i == '/':
stack.append(int(num1/num2))
return int(stack.pop())
此题学到了如下几点
- eval()可以用于评估一个字符串,如’a+b’并把它转化为有意义的式子计算,但是要慎用,因为很慢
- a//b和int(a/b)只在结果大于0时是一样的,都是向下取整,小于0时//仍然会向下取整,而int取整则会向上取整!!这就是为什么//叫做地板除,因为它结果始终向下取整
- operator模块可以导入一系列比较大小和计算的高效率函数,其功能与运算符一致,如add,sub,mul等等
- 字典中的值可以为一个函数名,例如{‘+’: add},甚至可以放lambda的匿名函数,在使用键访问此值时直接调用此函数