LeetCode 682. 棒球比赛

Scroll Down

LeetCode 682. 棒球比赛

题目:

你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
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。
示例 2:

输入: ["5","-2","4","C","D","9","+","+"]
输出: 27
解释: 
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到-2分。总数是:3。
第3轮:你可以得到4分。总和是:7。
操作1:第3轮的数据无效。总数是:3。
第4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1。
第5轮:你可以得到9分。总数是:8。
第6轮:你可以得到-4 + 9 = 5分。总数是13。
第7轮:你可以得到9 + 5 = 14分。总数是27。
注意:

输入列表的大小将介于1和1000之间。
列表中的每个整数都将介于-30000和30000之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/baseball-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

栈解法

在这个字符串数组中,总共有4种类型的字符串,整数,"+",D,C 这四种字符串,其中其余三个都只是对当前栈顶进行操作,唯有+号是需要操作两轮比赛的得分,这就导致了我们不能直接简单的入栈与出栈,需要考虑+号的场景该如何处理,这里做法是如果是+号的话,我们需要先出栈栈顶,再使用peek获得第二个值,累计之后称为本轮分数,此时再将按顺序将原来的栈顶值在入栈,再将本轮分数入栈,并且每次操作栈的时候也需要同步对count累计值进行操作.

public int calPoints(String[] ops) {
        Stack<Integer> stack = new Stack<>();
        int count = 0;
        for(String op : ops){
            switch(op){
                case "+":int first = stack.pop();
                    int second = stack.peek();
                    stack.push(first);
                    int thisPoint = first + second;
                    stack.push(thisPoint);
                    count +=thisPoint;
                    break;
                case "D":int temp = stack.peek() * 2;
                    count += temp;
                    stack.push(temp);
                    break;
                case "C":int thisTemp = stack.pop();
                    count -=thisTemp;
                    break;
                default:int point = Integer.valueOf(op); stack.push(point);count += point;                              break;
            }
        }
        return count;
    }