假设我们有一个棒球比赛得分记录器。我们有一个字符串列表;每个字符串可以是以下4种类型之一-
整数(一个回合的分数)-表示我们在这一回合中获得的分数。
“ +”(一个回合的得分)-表示我们在这一回合中获得的分数是最后两个有效回合的分数之和。
“ D”(一个回合的得分)-表示我们在这一回合中获得的点数是上一个有效回合点数的两倍数据。
“ C”(一个操作,不是回合的分数)-表示我们获得的最后一个有效回合的积分是无效的,应删除。
请注意,每个回合的操作都是永久性的,可能会对之前和之后的回合产生影响。我们必须找到所有回合中可以得到的总和。
因此,如果输入类似于[“ 5”,“ 2”,“ C”,“ D”,“ +”],则输出将为30。这实际上是为了
第一轮-我们可以得到5分。总和为:5。
第二轮-我们可以得到2分。总和为:7。
操作1-第二轮的数据无效。总和为:5。
第三轮-我们可以得到10分。总和是:15。
第4轮-我们可以获得5 + 10 = 15分。总和是:30。
为了解决这个问题,我们将遵循以下步骤-
堆栈:=空列表
对于操作中的每个i,
最后将我插入堆栈
从堆栈中删除最后一个元素
在末尾插入(堆栈的最后一个元素* 2)到堆栈中
第一个:= stack [堆栈大小-1],第二个:= stack [堆栈大小-2]
在末尾插入(第一个+第二个)到堆栈中
如果我与“ +”相同,则
否则,当我与“ D”相同时,则
否则,当我与“ C”相同时,
除此以外,
返回堆栈所有元素的总和
让我们看下面的实现以更好地理解-
class Solution: def calPoints(self, ops): stack = [] for i in ops: if i == "+": first, second = stack[len(stack) - 1], stack[len(stack) - 2] stack.append(first + second) elif i == "D": stack.append(stack[-1] * 2) elif i == "C": stack.pop() else: stack.append(int(i)) return sum(stack) ob = Solution()print(ob.calPoints(["5","2","C","D","+"]))
["5","2","C","D","+"]
输出结果
30