Leetcode--棒球比赛(c++/python3/Java/JavaScript)

一、题目

你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:

  1. 整数 x - 表示本回合新获得分数 x
  2. "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
  3. "D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
  4. "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/hNMAmicon-default.png?t=N7T8http://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/ypTWVicon-default.png?t=N7T8http://t.csdnimg.cn/ypTWV

代码里还提到了auto,在此也介绍一下:

http://t.csdnimg.cn/ZKweJicon-default.png?t=N7T8http://t.csdnimg.cn/ZKweJ

 代码如下:

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值