返回
LeetCode 682 棒球比赛,别被特殊规则吓到了
前端
2023-12-22 08:46:49
LeetCode 682:棒球比赛
题目
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。
特殊赛制规则:
- 一支球队在一个回合中可以获得 1、2 或 3 分,或者什么分都没有得。
- 如果一支球队在一个回合中得分为 0,则这个回合结束,下一支球队开始一个新回合。
- 如果一支球队在一个回合中获得恰好 1 分,则这个回合结束,下一支球队延续当前回合。
- 如果一支球队在一个回合中获得恰好 2 分,则这个回合结束,下一支球队延续当前回合,并且将上一个回合的得分加到本回合的得分上。
- 如果一支球队在一个回合中获得恰好 3 分,则这个回合结束,下一支球队延续当前回合,并且将上两个回合的得分都加到本回合的得分上。
- 如果一支球队在一个回合中获得恰好 4 分,则这个回合结束,下一支球队开始一个新回合。
输入:
输入是一个字符串数组 ops,其中 ops[i] 可以是字符串 "1"、"2"、"3"、"4" 或 "out"。
- "1"、"2"、"3" 和 "4" 表示球队在本回合中获得 1、2、3 或 4 分。
- "out" 表示球队在本回合中没有得分。
输出:
返回一个整数数组,其中每个元素表示球队在整个比赛中获得的总得分。
示例:
示例 1:
输入:ops = ["5","-2","4","C","D","9","+"]
输出:[27,12,28]
解释:
- 5 分: 记录 [5]
- -2 分:记录 [5,-2]
- 4 分:记录 [5,-2,4]
- C(取消):记录 [5,-2]
- D(双倍):记录 [5,-2,4,-2]
- 9 分:记录 [5,-2,4,-2,9]
- +(加倍):记录 [5,-2,4,-2,9,9]
最终得分:[5, -2, 4, -2, 9, 9] => [27, 12, 28]
示例 2:
输入:ops = ["1"]
输出:[1]
示例 3:
输入:ops = ["1","1","1","1","1"]
输出:[5]
题解:
这道题目乍一看可能会让人摸不着头脑,但其实它的本质就是一个模拟题。我们只需要按照规则,一步一步地模拟出比赛的过程,就能得到最终的得分。
我们可以使用一个栈来保存比赛的得分记录。当一支球队在一个回合中得分时,我们就将得分压入栈中。如果一支球队在一个回合中没有得分,我们就将栈顶的得分弹出。如果一支球队在一个回合中获得 2 分或 3 分,我们就将上一个回合或上两个回合的得分也弹出,并将其加到当前回合的得分中。
下面是代码实现:
class Solution {
public int[] calPoints(String[] ops) {
Stack<Integer> stack = new Stack<>();
for (String op : ops) {
if ("+".equals(op)) {
int top = stack.pop();
int secondTop = stack.pop();
stack.push(secondTop);
stack.push(top);
stack.push(top + secondTop);
} else if ("D".equals(op)) {
stack.push(stack.peek() * 2);
} else if ("C".equals(op)) {
stack.pop();
} else {
stack.push(Integer.valueOf(op));
}
}
int[] res = new int[stack.size()];
for (int i = stack.size() - 1; i >= 0; i--) {
res[i] = stack.pop();
}
return res;
}
}
总结:
LeetCode 682 棒球比赛这道题目考察的是我们对规则的理解和代码实现能力。通过使用栈来模拟比赛过程,我们可以轻松地解决这道题目。希望这篇文章能对你有所帮助!