Python 棒球游戏


假设我们有一个棒球比赛积分记录器。我们有一系列字符串;每个字符串可以是以下四种类型之一:

  • 整数(一轮的得分)——表示我们这一轮获得的分数。
  • “+”(一轮的得分)——表示我们这一轮获得的分数是最后两轮有效分数的总和。
  • “D”(一轮的得分)——表示我们这一轮获得的分数是上一轮有效分数的两倍。
  • “C”(一个操作,不是一轮的得分)——表示我们上一轮获得的有效分数无效,应该删除。

请注意,每一轮的操作都是永久性的,并且可能对之前和之后的轮次产生影响。我们必须找到所有轮次中我们可以获得的分数总和。

因此,如果输入类似于 ["5","2","C","D","+"],则输出将为 30。这是因为:

  • 第一轮 - 我们获得 5 分。总分:5。
  • 第二轮 - 我们获得 2 分。总分:7。
  • 操作 1 - 第二轮的数据无效。总分:5。
  • 第三轮 - 我们获得 10 分。总分:15。
  • 第四轮 - 我们获得 5 + 10 = 15 分。总分:30。

为了解决这个问题,我们将遵循以下步骤:

  • 堆栈 := 空列表
  • 对于 ops 中的每个 i,执行:
    • 如果 i 等于 “+”,则
      • first := stack[stack 大小 - 1],second := stack[stack 大小 - 2]
      • 将 (first + second) 插入堆栈的末尾
    • 否则,如果 i 等于 “D”,则
      • 将 (堆栈的最后一个元素 * 2) 插入堆栈的末尾
    • 否则,如果 i 等于 “C”,则
      • 从堆栈中删除最后一个元素
    • 否则,
      • 将 i 插入堆栈的末尾
  • 返回堆栈中所有元素的总和

让我们看看下面的实现来更好地理解:

示例

 在线演示

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

更新于:2020年7月4日

2K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告