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

leetcode之棒球比赛

程序员文章站 2022-07-15 12:22:13
...

棒球计分

题目描述:

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

思路

首先输入一个数组 , 如果不满足前提要求则直接返回0 , 如果满足 , 则继续进行判断, 用一个栈去表示数组中每一个位置的分数 , 如果遇到字母"D", 则访问栈顶元素并乘2后放入栈中 , 注意原来的元素没有弹栈!如果遇到"+"时则访问(不是弹栈)栈的最上2个元素进行加操作后再放入栈顶 , 只有在遇到字母 "C"时, 则弹出栈顶元素 , 最后对栈内所有元素进行求和.

编程实现

class Solution {
    private Stack<Integer> numStack = new Stack<Integer>();

    public int calPoints(String[] ops) {

        //判断长度是否超出题目要求
        if(ops.length > 1000 || ops.length < 1){
            return 0;
        }

        for (int i = 0; i<=ops.length-1 ; i++){
            try{
                int number = Integer.parseInt(ops[i]);
                //判断数字大小是否超出题目要求
                if(number > 30000 || number < -30000){
                    return 0;
                }else{
                    numStack.push(number);
                }
            }catch(Exception ex){
                //栈判空, 若为空, 则此次操作没有任何意义
                if(numStack.empty()){
                    continue;
                }
                //不是数字, 会抛出异常, 此时不抛出, 作操作判断
                switch (ops[i]){
                    case "C":
                        numStack.pop();
                        continue;
                    case "D":
                        Integer peek = numStack.peek();
                        numStack.push(peek*2);
                        continue;
                    case "+":
                        if(numStack.size() < 2){
                            numStack.push(numStack.peek());
                        }else{
                            Integer top = numStack.peek();
                            Integer second = numStack.get(numStack.size() - 2);
                            numStack.push(top+second);
                        }
                        continue;
                    default:
                        break;
                }
            }
        }
        //求和
        int sum = 0;
        for (Integer integer : numStack) {
            sum += integer;
        }
        return sum;
    }
}