学习记录@day11:栈与队列part02

学习记录@day11:栈与队列part02

20. 有效的括号

'''
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
'''

题目链接:https://leetcode.cn/problems/valid-parentheses/
首先存在三种不匹配的情况:
学习记录@day11:栈与队列part02_第1张图片
解题思想:
遍历字符串,首先将遇到的括号入栈,遇到匹配的括号则将字符串出栈。遍历完成后如果栈为空,则说明全都匹配了,否则,存在不匹配的字符串。
本来想自己写写,但是不知道怎么区分左右括号,o(╥﹏╥)o。

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack=[]
        for item in s:
            if item=='(':
                stack.append(')')
            elif item =='[':
                stack.append(']')
            elif item =='{':
                stack.append('}')
			#not stack:如果栈为空,则返回False。
			#这是因为如果栈为空,则没有栈顶元素,也就无法比较。
			#stack[-1]!=item:如果栈不为空,但栈顶元素与给定的元素不相同,则返回False。
			#stack[-1]是栈顶元素,item是给定的元素。
			#如果它们不相同,则说明栈顶元素与给定的元素不匹配。  
            elif not stack or stack[-1]!=item:
                return False
            else:
                stack.pop()
        #简化的条件语句,用于检查栈(stack)是否为空。如果栈为空,则返回True;否则返回False。
        return True if not stack else False

现在看真简单。

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

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

题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
没有看讲解前自己的解题思路是:
1.将每个字符依次入栈,如果入栈的字符与栈顶相同,则将栈顶字母出栈,再将其他字母入栈。
2.注意栈为空的情况。
自己写出来了,()

class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack=[]
        for item in s:
            #如果栈为空,将字母放入栈内
            if not stack:
                stack.append(item)
            #如果栈不为空,判断入栈字母是否和栈顶字母相同,相同则将栈顶字母出栈
            #不同则入栈
            else:
                if stack[-1]==item:
                    stack.pop()
                else:
                    stack.append(item)
            
        return ''.join(stack)

随想录上还给了双指针操作

res=list(s)
        slow=fast=0
        length=len(res)
        while fast<length:
            #如果一样一直换,不一样回吧后面的填在slow的位置
            res[slow]=res[fast]
            #如果发现和前一个不一样,就退一格指针
            if slow>0 and res[slow] == res[slow-1]:
                slow-=1
            else:
                slow+=1
            fast+=1
        return ''.join(res[0:slow])

150. 逆波兰表达式求值

'''
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
输入:tokens = ["2","1","+","3","*"]
输出:9
'''

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
逆波兰表示法(Reverse Polish Notation,简称RPN),也叫后缀表达式,是一种将中缀表达式转换为后缀表达式的算法。在逆波兰表示法中,操作符位于操作数的后面,因此不需要使用括号来改变运算顺序。
中缀表达式是最常见的表达式形式,它将操作符放在操作数的中间。(3 + 4) * 2
**前缀表达式(也称为波兰式)**是一种将操作符放在操作数之前的表达式形式。例如,“+ 3 4"是一个前缀表达式。前缀表达式不需要使用括号来改变运算顺序,而是通过操作符的位置来确定计算的顺序。”+ * 3 4 2"表示先将3和4相乘,然后再加上2。
**后缀表达式(也称为逆波兰式)**是一种将操作符放在操作数之后的表达式形式。例如,"3 4 +"是一个后缀表达式。后缀表达式也不需要使用括号来改变运算顺序,而是通过操作符的位置来确定计算的顺序。例如,"3 4 * 2 /"表示先将3和4相乘,然后将结果除以2。
没有看解析前的解题思路
1.将元素依次入栈。遇到算法符号时,将栈内元素进行计算后入栈,再入栈其余元素。
没有看讲解前写的代码,不知道为啥会出错。o(╥﹏╥)o

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        stack=[]
        for i in tokens:
            #如果栈为空
            stack.append(i)
            if i=='+' or i=='-'or i=='*'or i=='/':
                res=str(eval(stack[-3]+i+stack[-2]))
                #print(res)
                for m in range(3):
                    stack.pop()
                stack.append(res)
        return int(stack[-1])

'''
出错原因:除法时没有向下取整
以下为修改以后的代码,但是今天力扣更新,在旧版能成功通过,新版报错!
'''
class Solution(object):
    def evalRPN(self, tokens):
        stack=[]
        for i in tokens:
            #如果栈为空
            stack.append(i)
          
            if i=='+' or i=='-'or i=='*':
                res=str((eval(stack[-3]+i+stack[-2])))
                for m in range(3):
                    stack.pop()
                stack.append(res)
            elif i == '/':
              
                res = str(int(eval(stack[-3] + i + stack[-2])))
            
                for m in range(3):
                    stack.pop()
                stack.append(res)
       
        return int(stack[-1])

随想录代码

from operator import add, sub, mul

class Solution:
    op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
    
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token not in {'+', '-', '*', '/'}:
                stack.append(int(token))
            else:
                op2 = stack.pop()
                op1 = stack.pop()
                stack.append(self.op_map[token](op1, op2))  # 第一个出来的在运算符后面
        return stack.pop()
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for item in tokens:
            if item not in {"+", "-", "*", "/"}:
                stack.append(item)
            else:
                first_num, second_num = stack.pop(), stack.pop()
                stack.append(
                    int(eval(f'{second_num} {item} {first_num}'))   
                    # 第一个出来的在运算符后面
                )
        return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的

总结

今天的代码能写写了,好感动o(╥﹏╥)o,继续加油!
参考链接:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

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