你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x
"+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
"D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
"C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
示例 1:
输入:ops = ["5","2","C","D","+"]
输出:30
解释:
"5" - 记录加 5 ,记录现在是 [5]
"2" - 记录加 2 ,记录现在是 [5, 2]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5].
"D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10].
"+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15].
所有得分的总和 5 + 10 + 15 = 30
示例 2:
输入:ops = ["5","-2","4","C","D","9","+","+"]
输出:27
解释:
"5" - 记录加 5 ,记录现在是 [5]
"-2" - 记录加 -2 ,记录现在是 [5, -2]
"4" - 记录加 4 ,记录现在是 [5, -2, 4]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2]
"D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4]
"9" - 记录加 9 ,记录现在是 [5, -2, -4, 9]
"+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5]
"+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14]
所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27
示例 3:
输入:ops = ["1"]
输出:1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/baseball-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里主要运用stack栈中的top,pop,以及push方法
在c++ 中,stack的头文件是#include<stack>
stack<int> s; //以int型s为例
int x;
s.push(x); //将x压入栈顶
s.top(); //返回栈顶的元素
s.pop(); //删除栈顶的元素
s.size(); //返回栈中元素的个数
s.empty(); //检查栈是否为空,若为空返回true,否则返回false
对于stoi()函数,atoi()函数,都是C++中把String类型转换为int类型的函数
他们的头文件都是#include<cstring>
atoi()和stoi()不同点在于:
atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char*类型的,而stoi()的参数是const string*,不需要转化为 const char*;
stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error
如
string s2 = "-214748"
string s3 = "214748666666663"
cout << stoi(s2) << endl;
cout << atoi(s3.c_str()) << endl;
class Solution {
public:
int calPoints(vector<string>& ops) {
stack<int> s;
int ans=0;
for(int i=0;i<ops.size();i++){
if(ops[i]=="D")
{
int a = s.top();
s.push(2*a);
}
else if(ops[i]=="C"){
s.pop();
}else if(ops[i]=="+"){
int a = s.top();
s.pop();
int b = s.top();
s.push(a);
s.push(a+b);
}else
s.push(stoi(ops[i]));
}
while(!s.empty()){
ans +=s.top();
s.pop();
}
return ans;
}
};