棒球比赛计分算法 - 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;
    }
};

代码说明:

  1. 使用一个栈 s 来存储所有有效的分数。
  2. 遍历操作序列,对每个操作进行处理:
    • 'C': 弹出栈顶元素,并将该元素的值从总得分中减去。
    • 'D': 将栈顶元素的值乘以 2,并将结果压入栈,同时将该值添加到总得分中。
    • '+': 将栈顶两个元素的值相加,并将结果压入栈,同时将该值添加到总得分中。
    • 整数: 将该整数压入栈,并将该值添加到总得分中。
  3. 最后返回总得分。
棒球比赛计分算法 - C++ 实现

原文地址: https://www.cveoy.top/t/topic/oEcb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录