leetcode力扣刷题打卡
题目:682. 棒球比赛
描述:你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x
“+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
“D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
“C” - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
解题思路
1、进进出出的操作那肯定是栈了;
2、+的时候,为了得到前两次的得分,需要先弹出前一次的得分,拿到前第二次的得分后,再把前一次的得分放回去;
3、stoi函数(字符串转整型)也太好用了;
原代码##
class Solution {
public:
int calPoints(vector<string>& ops) {
stack<int>s;
int ans = 0;
for (int i = 0; i < ops.size(); ++i) {
char ch = ops[i][0];
if (ch == 'C') {
ans -= s.top();
s.pop();
} else if (ch == 'D') {
int temp = s.top() * 2;
s.push(temp);
ans += s.top();
} else if (ch == '+'){
int pre1 = s.top();
s.pop();
int pre2 = s.top();
s.push(pre1);
int temp = pre1 + pre2;
s.push(temp);
ans += s.top();
} else {
int temp = stoi(ops[i]);
s.push(temp);
ans += temp;
}
}
return ans;
}
};