一、题目
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表
ops
,其中ops[i]
是你需要记录的第i
项操作,ops
遵循下述规则:
- 整数
x
- 表示本回合新获得分数x
"+"
- 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D"
- 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。"C"
- 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。请你返回记录中所有得分的总和。
二、我的解答
总体而言,这道题真的可以算简单题。看到这题之后我首先想到的就是“if-else”。以下是我的解答:
class Solution {
public:
int calPoints(vector<string>& operations) {
vector<int> temp;
int num=operations.size();
for(int i=0;i<num;i++){
if(!temp.empty() && operations.at(i)=="D"){
int numtemp=temp.back();
temp.push_back(2*numtemp);
}
else if(!temp.empty() && operations.at(i)=="C"){
temp.pop_back();
}
else if(!temp.empty() && operations.at(i)=="+"){
temp.push_back(temp.back()+(temp[temp.size()-2]));
}
else{
int numtemp=stoi(operations.at(i));
temp.push_back(numtemp);
}
}
int NUM=0;
for(int i=0;i<temp.size();i++){
NUM+=temp.at(i);
}
return NUM;
}
};
需要注意一下“stoi”这个函数,它用于将字符串转换为整数型。可以参考这篇博客:http://t.csdnimg.cn/hNMAmhttp://t.csdnimg.cn/hNMAm
三、官网解答
官网提供了7种编程语言的解法,除了我博客标题列出来的那些,还有c/c#/Golang,因为我比较熟悉下面这几种语言,所以只列出了官网中提到的它们的解法。
1.python3
class Solution:
def calPoints(self, ops: List[str]) -> int:
ans = 0
points = []
for op in ops:
if op == '+':
pt = points[-1] + points[-2]
elif op == 'D':
pt = points[-1] * 2
elif op == 'C':
ans -= points.pop()
continue
else:
pt = int(op)
ans += pt
points.append(pt)
return ans
作者:力扣官方题解
链接:https://leetcode.cn/problems/baseball-game/solutions/1366145/bang-qiu-bi-sai-by-leetcode-solution-gxab/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2.c++
官方解答用的是“switch-case”,其实它就是“if-else”的升级版。
先介绍一下这个固定搭配:
http://t.csdnimg.cn/ypTWV
http://t.csdnimg.cn/ypTWV
代码里还提到了auto,在此也介绍一下:
代码如下:
class Solution {
public:
int calPoints(vector<string>& ops) {
int ret = 0;
vector<int> points;
for (auto &op : ops) {
int n = points.size();
switch (op[0]) {
case '+':
ret += points[n - 1] + points[n - 2];
points.push_back(points[n - 1] + points[n - 2]);
break;
case 'D':
ret += 2 * points[n - 1];
points.push_back(2 * points[n - 1]);
break;
case 'C':
ret -= points[n - 1];
points.pop_back();
break;
default:
ret += stoi(op);
points.push_back(stoi(op));
break;
}
}
return ret;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/baseball-game/solutions/1366145/bang-qiu-bi-sai-by-leetcode-solution-gxab/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3.Java
class Solution {
public int calPoints(String[] ops) {
int ret = 0;
List<Integer> points = new ArrayList<Integer>();
for (String op : ops) {
int n = points.size();
switch (op.charAt(0)) {
case '+':
ret += points.get(n - 1) + points.get(n - 2);
points.add(points.get(n - 1) + points.get(n - 2));
break;
case 'D':
ret += 2 * points.get(n - 1);
points.add(2 * points.get(n - 1));
break;
case 'C':
ret -= points.get(n - 1);
points.remove(n - 1);
break;
default:
ret += Integer.parseInt(op);
points.add(Integer.parseInt(op));
break;
}
}
return ret;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/baseball-game/solutions/1366145/bang-qiu-bi-sai-by-leetcode-solution-gxab/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4.JavaScript
var calPoints = function(ops) {
let ret = 0;
const points = [];
for (const op of ops) {
const n = points.length;
switch (op[0]) {
case '+':
ret += points[n - 1] + points[n - 2];
points.push(points[n - 1] + points[n - 2]);
break;
case 'D':
ret += 2 * points[n - 1];
points.push(2 * points[n - 1]);
break;
case 'C':
ret -= points[n - 1];
points.pop();
break;
default:
ret += parseInt(op);
points.push(parseInt(op));
break;
}
}
return ret;
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/baseball-game/solutions/1366145/bang-qiu-bi-sai-by-leetcode-solution-gxab/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。