20. 有效的括号 - 力扣(LeetCode)
1. 文章链接
2. 看到题目的第一想法
搞个栈,只压左括号, 遇到右括号就弹栈,
- 如果弹出的字符与右括号不匹配,或者为空,那就返回
false, - 否则就继续遇到左括号就压栈,遇到右括号就弹栈。
如果过程中没有返回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. 文章链接
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. 文章链接
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 // b 和 int(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分钟。