欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode之棒球比赛

程序员文章站 2022-07-15 12:21:55
...

棒球比赛

题目

你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
2. “+”(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
3. “D”(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
4. “C”(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。

每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。

示例 1:

输入: [“5”,“2”,“C”,“D”,"+"]
输出: 30
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。
第4轮:你可以得到5 + 10 = 15分。总数是:30。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/baseball-game

思路

因为总是会更新新一轮的值所以考虑使用栈来解决。
1.分析 “+” 这时需要拿出上一轮与上上一轮的值进行相加。首先执行pop()操作拿到上一轮的分数(这里为了方便理解变量名取为second),
再执行peek()操作取得上上一轮的值。最后放入上一轮与这一轮的值。
注:pop()操作会删除栈顶元素而peek()操作不会。
2.分析“D”操作,这个直接peek()取得上一轮的值×2再压入栈就可以了。
3.分许“C”操作,这个也是直接pop()删除栈顶就可以了。
4.整数操作就直接转换为数字压入栈即可。
5.最后把每一轮的分分数相加即可。
栈还是在解决某些问题比如要更新最近的值等等问题还是比较简便的。

代码

class Solution {
    public int calPoints(String[] ops) {
        Stack<Integer> stack = new Stack<>();
        for(String op : ops){
            if(op.equals("+")){
                int second = stack.pop();
                int sum = second + stack.peek();
                stack.push(second);
                stack.push(sum);
            }else if(op.equals("C")){
                stack.pop();
            }else if(op.equals("D")){
                stack.push(stack.peek()*2);
            }else{
                stack.push(Integer.valueOf(op));
            }  
        }
        int res = 0;
        for(Integer score : stack){
            res += score;
        }
        return res;
    }
}