问题描述:给你一个字符串数组,其中包含:数字、C、D、+、四种字符。数字表明你这一局得分,C表明你上一局得分无效,D表明你这句得分是上一局得分两倍,+表明你这一局得分是前两次有效得分之和。C不是有效得分并且会移除一次有效得分。
思路:原打算用两个指针分别记录上一局和上上局得分。但发现遇上连续多个C时,无法追溯之前的得分。题目上的标签为stack。C、D操作确实很像stack。但是+需要pop两次再push进去。再三考虑下,干脆用同样长的int数组记录每局得分,然后再累加好了。
原答案:
public int calPoints(String[] ops) {
int length=ops.length;
int [] result=new int[length];
int j=-1;
String s="";
int totalSum=0;
for(int i=0;i<length;i++){
s=ops[i];
if("C".equals(s)){
result[j]=0;
j=j-1;
}else if("D".equals(s)){
result[j+1]=result[j]*2;
j=j+1;
}else if("+".equals(s)){
result[j+1]=result[j]+result[j-1];
j=j+1;
}else{
result[j+1]=toNum(s);
j=j+1;
}
}
for(int i=0;i<length;i++){
totalSum=totalSum+result[i];
}
return totalSum;
}
private int toNum(String s){
return Integer.valueOf(s);
}
最佳答案:
public int calPoints(String[] ops) {
int sum = 0;
int[] valid = new int[ops.length];
int v = -1;
for(int i = 0; i < ops.length; i++){
if(ops[i].equals("C")){
sum -= valid[v];
v--;
} else if(ops[i].equals("D")){
int d = valid[v] + valid[v];
v++;
valid[v] = d;
sum += d;
} else if(ops[i].equals("+")){
int p = valid[v] + valid[v - 1];
v++;
valid[v] = p;
sum += p;
} else {
int val = Integer.parseInt(ops[i]);
v++;
valid[v] = val;
sum += val;
}
}
return sum;
}
整体思路基本一致,使用了另一个数组记录得分。不同的是,得分在第一次遍历的时候就能计算出来了,不用再遍历一次了