[682] Baseball Game Java

原题链接:LeetCode题目682 Baseball Game

题目简述:实现一个网球计分器,根据输入的一系列计分字符串,输出最终得分。其中计分字符串分为4种类型:

(1)整型,表示本轮有效分数为该整数;

(2)“+”,表示本轮有效分数=前两轮有效分数之和;

(3)“D”,表示本轮有效分数=前一轮有效分数*2;

(4)“C”,表示前一轮的有效分数变为无效;

由此可知,需要使用一个int数组记录每一轮的有效分数,从而累加计算出最终得分。

引用原题中的示例2,定义int数组 valids,数组长度validCount,最终结果result,计算过程如下:

Input: ["5","-2","4","C","D","9","+","+"]
Output: 27
Explanation: 
Round 1: valids={5},result=5;
Round 2: valids={5,-2},result=3;
Round 3: valids={5,-2,4},result=7;
C:前一轮的4无效,valids={5,-2},result=3;
Round 4: 本轮分值=-2*2=-4,valids={5,-2,-4},result=-1;
Round 5: valids={5,-2,-4,9},result=8;
Round 6: 本轮分值=-4+9=5;valids={5,-2,-4,9,5},result=13;
Round 7: 本轮分值=14,valids={5,-2,-4,9,5,13},result=27。

代码实现如下,使用int数组,空间复杂度O(n),遍历一遍,时间复杂度O(n)。

public int calPoints(String[] ops) {
        int result = 0;
        // 存储有效分值、有效分值个数
        int[] valids = new int[ops.length];
        int validCount = 0;
        for (int i = 0; i < ops.length; i++) {
            String cur = ops[i];
            int resultCur = 0;
            if (cur.equals("+")) {
                // sum
                if (validCount > 1)
                    resultCur = valids[validCount-1] + valids[validCount-2];
                else if (validCount == 1)
                    resultCur = valids[0];
                valids[validCount++] = resultCur;
                result += resultCur;
            } else if (cur.equals("C")) {
                // remove
                if (validCount > 0) {
                    result -= valids[--validCount];
                }
            } else if (cur.equals("D")) {
                // double
                if (validCount > 0) {
                    resultCur = valids[validCount-1] * 2;
                }
                valids[validCount++] = resultCur;
                result += resultCur;
            } else {
                // number
                resultCur = Integer.parseInt(cur);
                valids[validCount++] = resultCur;
                result += resultCur;
            }
        }
        return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值