删除字符串中的所有相邻重复项:
思路:
定义一个空栈,遍历原字符串,只要遍历的字符不和栈顶元素相同,就入栈,反之就出栈,注空栈的情况
代码:
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.将数组中的元素放入单调队列时,因为要确保单调队列为单调,要入队元素要从最小的值开始比较,只要比队列的数大,就要一直比较,并弹出较小的数,这样才能让单调队列一直保持单调。