代码随想录训练营第11天 || 1.删除字符串中的所有相邻重复项 2.逆波兰表达式求值 3.滑动窗口最大值

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

讲解:代码随想录

思路:

定义一个空栈,遍历原字符串,只要遍历的字符不和栈顶元素相同,就入栈,反之就出栈,注空栈的情况

代码:

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack =[]
        for i in s:
            if stack and i==stack[-1]:
                stack.pop()
            else:
                stack.append(i)
        return ''.join(stack)
        

遇到的问题:

1.对于空栈情况的检测

2.

讲解:代码随想录

思路:

使用栈,for循环遍历逆波兰式,当遇到数字就压入栈中,当遇到运算符,就弹出栈顶的两个元素,进行运算,注意先弹出的是除数(如果是除法,减法类比)

代码:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        
        fu =['*','/','+','-']
        for i in tokens:
            if i not in fu  :
                stack.append(int(i))
            else:
                b =stack.pop()
                a =stack.pop()
                if i=='*':
                    res = a*b
                elif i=='/':
                    res= int(a/b)#截断取整,不四舍五入,a//b会向负无穷取整
                elif i=='-':
                    res=a-b
                elif i=='+':
                    res=a+b
                stack.append(res)
        return stack.pop()
            

遇到的问题:

1.对于python的除法运算问题:第一种a/b是除完后变成浮点数,第二种a//b,除完后会向负无穷取整,例如7//2 = 3 而-7//2 = -4 第三种int(a/b)这样除就是截断取整,直接截断小数

滑动窗口最大值

讲解:代码随想录

思路:

通过单调队列(使用双端队列实现),遍历整个数组,将数组中的元素放入单调队列,并将单调队列较小的数弹出,只有当要加入的数大于单调数组最小的数时,才会弹出单调队列较小的数。并且当窗口移动,更新单调队列里的数(单调队列是对窗口内的数进行排序单调),最后每次记录窗口的最大值。

代码:

from collections import deque#deque是双端队列的意思
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        result =[]
        denums = deque()
        for i in range(len(nums)):
            self.caozuo(denums,nums[i])#将数组中的元素放入单调队列,并将较小的弹出
            if i+1 >k and nums[i-k] == denums[0]:
                denums.popleft()#双端队列的特有操作
            if i+1 >=k :#记录每个窗口的最大值
                result.append(denums[0])
        return result

    def caozuo(self,denums,num):
        while denums and denums[-1]<num:#动态的过程,确保单调队列中是单调的,所以要比较彻底
            denums.pop()
        denums.append(num)


        

遇到的问题:

1.将数组中的元素放入单调队列时,因为要确保单调队列为单调,要入队元素要从最小的值开始比较,只要比队列的数大,就要一直比较,并弹出较小的数,这样才能让单调队列一直保持单调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值