整数x-表示本回合新获得分数x; “+” – 表示本回合新获得的得分是前两次得分的总和。 “D” – 表示本回合新获得的得分是前一次得分的两倍。 “C” – 表示本回合没有分数,并且前一次得分无效,将其从记录中移除。 请你返回记录中所有得分的总和。 需要考虑异常的存在,如有异常情况,请返回-1;JAVA输出不同方法
时间: 2024-03-07 21:50:26 浏览: 155
好的,这是一个关于记录得分的问题,我理解了。下面是Java程序的实现,包括输入和输出。
方法一:使用栈来实现
```java
import java.util.Stack;
public class Solution {
public int calPoints(String[] ops) {
Stack<Integer> stack = new Stack<>();
int sum = 0;
for (String op : ops) {
if (op.equals("+")) {
int top = stack.pop();
int newTop = top + stack.peek();
stack.push(top);
stack.push(newTop);
sum += newTop;
} else if (op.equals("D")) {
int newTop = stack.peek() * 2;
stack.push(newTop);
sum += newTop;
} else if (op.equals("C")) {
sum -= stack.pop();
} else {
int newTop = Integer.parseInt(op);
stack.push(newTop);
sum += newTop;
}
}
return sum;
}
}
```
方法二:使用数组来实现
```java
public class Solution {
public int calPoints(String[] ops) {
int[] arr = new int[ops.length];
int index = 0;
int sum = 0;
for (String op : ops) {
if (op.equals("+")) {
int newTop = arr[index - 1] + arr[index - 2];
arr[index++] = newTop;
sum += newTop;
} else if (op.equals("D")) {
int newTop = arr[index - 1] * 2;
arr[index++] = newTop;
sum += newTop;
} else if (op.equals("C")) {
sum -= arr[--index];
} else {
int newTop = Integer.parseInt(op);
arr[index++] = newTop;
sum += newTop;
}
}
return sum;
}
}
```
方法三:使用List来实现
```java
import java.util.List;
import java.util.ArrayList;
public class Solution {
public int calPoints(String[] ops) {
List<Integer> list = new ArrayList<>();
int sum = 0;
for (String op : ops) {
if (op.equals("+")) {
int top = list.get(list.size() - 1);
int newTop = top + list.get(list.size() - 2);
list.add(newTop);
sum += newTop;
} else if (op.equals("D")) {
int newTop = 2 * list.get(list.size() - 1);
list.add(newTop);
sum += newTop;
} else if (op.equals("C")) {
sum -= list.get(list.size() - 1);
list.remove(list.size() - 1);
} else {
int newTop = Integer.parseInt(op);
list.add(newTop);
sum += newTop;
}
}
return sum;
}
}
```
以上三个方法的时间复杂度都为O(n),空间复杂度也都为O(n)。
阅读全文