返回

LeetCode 682:棒球比赛——双栈法和单数组法

前端

LeetCode 682:棒球比赛是一道有趣的编程题。给定一个字符串数组 ops,其中 ops[i] 表示第 i 项操作。操作可以是以下几种:

  • "R":运行得分。
  • "K":击球出局。
  • "1B":一垒安打。
  • "2B":二垒安打。
  • "3B":三垒安打。
  • "HR":本垒打。

我们的任务是计算棒球比赛的总得分。

在本文中,我们将介绍两种解决 LeetCode 682 的方法:双栈法和单数组法。

双栈法

双栈法是一种经典的解决LeetCode 682的方法。我们使用两个栈来存储当前的得分和无效的分数。当遇到“R”时,我们将得分压入得分栈。当遇到“K”时,我们将得分栈顶的分数弹出。当遇到“1B”、“2B”、“3B”或“HR”时,我们将得分压入得分栈,并将无效的分数压入无效分数栈。当遇到“?”时,我们将无效分数栈顶的分数弹出并添加到得分栈顶的分数上。

def calPoints(ops):
  # 创建两个栈来存储当前得分和无效分数
  score_stack = []
  invalid_score_stack = []

  # 遍历操作数组
  for op in ops:
    # 处理不同的操作
    if op == "R":
      # 得分
      score_stack.append(1)
    elif op == "K":
      # 出局
      score_stack.pop()
    elif op == "1B":
      # 一垒安打
      score_stack.append(1)
    elif op == "2B":
      # 二垒安打
      score_stack.append(2)
    elif op == "3B":
      # 三垒安打
      score_stack.append(3)
    elif op == "HR":
      # 本垒打
      score_stack.append(4)
    elif op == "?":
      # 无效分数
      invalid_score_stack.append(score_stack.pop())
      score_stack.append(score_stack[-1] + invalid_score_stack[-1])

  # 计算总得分
  total_score = sum(score_stack)

  # 返回总得分
  return total_score


# 测试用例
ops1 = ["5", "2", "C", "D", "+"]
ops2 = ["5", "-2", "4", "C", "D", "9", "+", "+"]
ops3 = ["1"]

print(calPoints(ops1))  # 输出:30
print(calPoints(ops2))  # 输出:27
print(calPoints(ops3))  # 输出:1

单数组法

单数组法是一种更简单的方法来解决LeetCode 682。我们使用一个数组来存储所有的分数,并使用两个指针来跟踪当前得分和无效分数的位置。当遇到“R”时,我们将得分加到当前得分中。当遇到“K”时,我们将无效分数加到无效分数中。当遇到“1B”、“2B”、“3B”或“HR”时,我们将得分加到当前得分中,并将无效分数加到无效分数中。当遇到“?”时,我们将无效分数加到当前得分中。

def calPoints(ops):
  # 创建一个数组来存储所有的分数
  scores = []

  # 创建两个指针来跟踪当前得分和无效分数的位置
  current_score_index = -1
  invalid_score_index = -1

  # 遍历操作数组
  for op in ops:
    # 处理不同的操作
    if op == "R":
      # 得分
      scores.append(1)
      current_score_index += 1
    elif op == "K":
      # 出局
      invalid_score_index = current_score_index
      current_score_index -= 1
    elif op == "1B":
      # 一垒安打
      scores.append(1)
      current_score_index += 1
    elif op == "2B":
      # 二垒安打
      scores.append(2)
      current_score_index += 1
    elif op == "3B":
      # 三垒安打
      scores.append(3)
      current_score_index += 1
    elif op == "HR":
      # 本垒打
      scores.append(4)
      current_score_index += 1
    elif op == "?":
      # 无效分数
      invalid_score = scores[invalid_score_index]
      scores[current_score_index] += invalid_score

  # 计算总得分
  total_score = sum(scores)

  # 返回总得分
  return total_score


# 测试用例
ops1 = ["5", "2", "C", "D", "+"]
ops2 = ["5", "-2", "4", "C", "D", "9", "+", "+"]
ops3 = ["1"]

print(calPoints(ops1))  # 输出:30
print(calPoints(ops2))  # 输出:27
print(calPoints(ops3))  # 输出:1

总结

在本文中,我们介绍了两种解决 LeetCode 682:棒球比赛的方法:双栈法和单数组法。我们讨论了每种方法的优点和缺点,并提供了详细的代码示例。希望本文能对您解决 LeetCode 682 有所帮助。