原题链接: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;
}