棒球比赛计分算法 - C++ 实现
棒球比赛计分算法 - C++ 实现
这是一场采用特殊赛制的棒球比赛,得分规则如下:
- 整数 x: 表示本回合新获得分数 x
- 'D': 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
- 'C': 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
你的任务是编写一个算法,根据给定的操作序列,计算出所有回合的总得分。
输入格式:
- 第一行:操作序列的长度 n
- 第二行:操作序列,每个操作之间用空格隔开
输出格式:
- 所有得分的总和
示例:
输入:
5
5 2 D + C
输出:
30
解释:
- 操作 1: 5,得分 5
- 操作 2: 2,得分 5 + 2 = 7
- 操作 3: 'D',得分 7 * 2 = 14
- 操作 4: '+',得分 14 + 7 = 21
- 操作 5: 'C',撤销前一次得分 21,得分 14
总得分: 5 + 2 + 14 = 21
C++ 代码:
#include <stack>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
int calPoints(vector<string>& ops) {
stack<int> s;
int sum = 0;
for (string op : ops) {
if (op == 'C') {
sum -= s.top();
s.pop();
} else if (op == 'D') {
int x = s.top();
s.push(x * 2);
sum += x * 2;
} else if (op == '+') {
int x = s.top();
s.pop();
int y = s.top();
s.push(x);
s.push(x + y);
sum += x + y;
} else {
int x = stoi(op);
s.push(x);
sum += x;
}
}
return sum;
}
};
代码说明:
- 使用一个栈
s来存储所有有效的分数。 - 遍历操作序列,对每个操作进行处理:
- 'C': 弹出栈顶元素,并将该元素的值从总得分中减去。
- 'D': 将栈顶元素的值乘以 2,并将结果压入栈,同时将该值添加到总得分中。
- '+': 将栈顶两个元素的值相加,并将结果压入栈,同时将该值添加到总得分中。
- 整数: 将该整数压入栈,并将该值添加到总得分中。
- 最后返回总得分。
原文地址: https://www.cveoy.top/t/topic/oEcb 著作权归作者所有。请勿转载和采集!