返回

682. 棒球比赛:球迷场上的激烈对决

前端

棒球比赛:球迷场上的激烈对决

大家好,我是挨打的阿木木,一名爱好算法的前端摸鱼老。今天我要跟大家分享的是leetcode 682题:《棒球比赛》。如果你也对算法感兴趣,欢迎关注我,一起学习。

题目 682. 棒球比赛

你正在观看一场棒球比赛,比赛记录是用整数数组scores来表示的,其中 scores[i] 表示第 i 局的得分。

在比赛中,可能会出现以下三种情况:

  • 加分 : +
  • 得分 : R
  • 取消 : X
  1. 如果出现加分(+),那么当前局得分记为上一局得分的两倍。
  2. 如果出现得分(R),那么当前局得分记为 1 分。
  3. 如果出现取消(X),那么取消上一次得分的记录。

示例 1:

输入:scores = [1, 2, 3, 4, 5]
输出:[1, 2, 4, 8, 16]
解释:
第 1 局得分:1 分
第 2 局得分:2 分
第 3 局得分:3 分,由于前一局得分为 2 分,所以这一局得分加倍
第 4 局得分:4 分,由于前一局得分为 4 分,所以这一局得分加倍
第 5 局得分:5 分,由于前一局得分为 4 分,所以这一局得分加倍

示例 2:

输入:scores = [4, 5, -2, -3, 1]
输出:[4, 9, 7, 4, 5]
解释:
第 1 局得分:4 分
第 2 局得分:5 分
第 3 局得分:-2 分,由于前一局得分为 5 分,所以这一局取消
第 4 局得分:-3 分,由于前一局得分被取消,所以这一局取消
第 5 局得分:1 分

算法实现

def calPoints(scores):
    """
    :type scores: List[int]
    :rtype: int
    """
    # 创建一个栈来存储得分
    stack = []
    
    # 遍历记分情况
    for score in scores:
        # 加分
        if score == "+":
            # 将前两局的得分相加并入栈
            stack.append(stack[-1] + stack[-2])
        # 得分
        elif score == "R":
            # 入栈 1 分
            stack.append(1)
        # 取消
        elif score == "X":
            # 栈顶元素出栈
            stack.pop()
        # 其他情况
        else:
            # 入栈当前得分
            stack.append(score)
    
    # 计算总得分
    total = 0
    for score in stack:
        total += score
    
    return total

分析

这个算法首先使用一个栈来存储得分。然后,它遍历记分情况并根据不同的情况对栈进行操作。最后,它计算总得分并将其返回。

复杂度分析

  • 时间复杂度:O(n),其中 n 是记分情况的数量。
  • 空间复杂度:O(n),其中 n 是记分情况的数量。

结语

这就是我分享的leetcode 682题:《棒球比赛》的解题方法,希望能帮助到你。如果你有更好的解法,欢迎在评论区留言与我交流。