题目描述:
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x
“+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
“D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
“C” - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
思路: 遍历输入的字符串数组,这里说是字符串数组其实每一个元素不是数字就是字母,那么我们可以通过使用charAt()方法只访问0位置字符,来判断每个字符串是数字还是别的字符。如果这么想就错了,我第一遍就犯了这个错误,因为有的数字可能是负数所以charAt(0)访问到的是’-‘号导致’-‘这个符号被单独处理了,这显然是错误的,因此换个思路我们可以只访问字符串的最后一个字符这样就能判断该字符串是字母还是数字了。经过上述操作我们能够判断字符串是字母还是数字,如果是不是数字就按照C\D+的规则进行处理即可,如果是数字则直接将其添加到建立的ArrayList中去,当然这些添加和删减整数的操作都要有一个索引来记录位置变化,具体可以看代码。最后使用一个变量来累加最终保存在ArrayList中的每一个元素。
代码:
class Solution {
public int calPoints(String[] operations) {
List<Integer> list = new ArrayList<>();
int index = 0;
for (int i = 0; i < operations.length; i++) {
char ch = operations[i].charAt(operations[i].length()-1);
if (!Character.isDigit(ch)) {
switch (ch) {
case '+':
list.add(list.get(index - 1) + list.get(index - 2));
index++;
break;
case 'D':
list.add(2 * list.get(index - 1));
index++;
break;
case 'C':
list.remove(index - 1);
index--;
break;
}
} else {
list.add(Integer.parseInt(operations[i]));
index++;
}
}
int sum = 0;
for (int i = 0; i < index; i++) {
sum += list.get(i);
}
return sum;
}
}