返回
LeetCode 682:棒球比赛——双栈法和单数组法
前端
2023-10-17 22:04:52
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 有所帮助。