总结
1.栈用在括号匹配,括号左右不想等,用栈匹配很巧妙
2.在循环字符串时:可以考虑利用:for each_s in s:形式,会节省代码行数
3.在进行重复删除,逆波兰都会用到栈,找到其中的共性就是,在遍历一边字符串时,被遍历过了元素也要被重复使用,而且重复使用的元素通常来说都是被操作元素的前一个元素,例如abbaca,要删除bb,之后就又是开头的a被利用,此时就要考虑栈,栈的特性就是先进后出
20. 有效的括号
题目链接:
自己想
1.想不出来,想不出来的原因在于由于要比较的左括号和右括号对应相等,但是不能简单用==号比较
看完题解
1.利用入栈,对应元素去判断,比如字符串搜索到’[',就将‘]’入栈,这个想法很巧妙,但是要想到这个解决办法的前提是是能将问题抽象成入栈出栈,才会考虑用这个方法
2.我看完题解思路写的答案是:我们用了两种不同策略,我感觉这个都行,没有谁比谁丝滑
elif len(ls) == 0: return False
elif len(ls) != 0 and ls.pop() != each_s:
return False
而官方给出的答案却利用or:
elif not stack or stack[-1] != item:
return False
else:
stack.pop()
完整代码
class Solution:
def isValid(self, s: str) -> bool:
n = len(s)
ls = []
if n%2 != 0:
return False
for each_s in s:
if each_s == '[': ls.append(']')
elif each_s == '{': ls.append('}')
elif each_s == '(': ls.append(')')
elif len(ls) == 0: return False
elif len(ls) != 0 and ls.pop() != each_s:
return False
if len(ls) != 0:
# print(2)
return False
1047. 删除字符串中的所有相邻重复项
题目链接:
自己想
1.应该是用栈,所以就是用一个栈来存放遍历过的元素
看完题解
1.看到题解也是用栈存放,但是题解答案写的及其剪短
自己认为代码之所以冗余,关键在于循环判断,直接用for item in s:其实就回简单很多
res = list()
for item in s:
if res and res[-1] == item:
res.pop()
else:
res.append(item)
return "".join(res) # 字符串拼接
完整代码(自己写的有点长)
class Solution:
def removeDuplicates(self, s: str) -> str:
s1 = []
s = list(s)
while(s):
if len(s1) == 0:
s1.append(s.pop())
elif s[-1] != s1[-1]:
s1.append(s.pop())
elif s[-1] == s1[-1]:
s.pop()
s1.pop()
s1.reverse()
s1 = ''.join(s1)
return s1
150. 逆波兰表达式求值
题目链接:
自己想
1.利用栈进行计算,leecode给出了提示
看完题解
1.题解思路与自己差不多,但是代码引入了
from operator import add, sub, mul
同时还使用了一个哈希
出现问题
看完题解与自己对比
1.注意到在进行除法运算,除数和被除数是有顺序区别的,减法也是
2.在自己调试代码时,发现使用//,对于负数会向下取整,于是对于负数结果用了ceil函数,但实际上不需要区分是否为负数,直接使用int(b/a)即可
完整代码
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
s1 = []
for each_token in tokens:
if each_token == "+":
c= s1.pop() + s1.pop()
s1.append(c)
elif each_token == "-":
c= -(s1.pop() - s1.pop())
s1.append(c)
elif each_token == '*':
c = s1.pop() * s1.pop()
s1.append(c)
elif each_token == '/':
a = s1.pop()
b = s1.pop()
c = int(b/a)#我以前写的引入别的库函数,为了在负数的时候也向0取整,直接用这个即可
s1.append(c)
else:
s1.append(int(each_token))
return(s1.pop())