letCode刷题笔记(2)——棒球问题
题目
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x
“+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
“D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
“C” - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/baseball-game
。
一、解题思路?
利用Java的栈:
- Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
- Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象
- Object push(Object element) 把项压入堆栈顶部
- boolean empty() 测试堆栈是否为空。
- int search(Object o) 返回对象在堆栈中的位置,以 1 为基数
二、代码
代码如下:
public class Test {
public static void main(String[] args) {
String[] arr = {"5","-2","C","D","+"};
System.out.println(calPoints(arr));
}
static int calPoints(String [] arr){
Stack<Integer> stack = new Stack();
for(String op : arr) {
if (op.equals("+")) {
int top = stack.pop();
int newtop = top + stack.peek();
stack.push(top);
stack.push(newtop);
} else if (op.equals("C")) {
stack.pop();
} else if (op.equals("D")) {
stack.push(2 * stack.peek());
} else {
stack.push(Integer.valueOf(op));
}
}
int ans = 0;
for(int score : stack) {
ans += score;
}
return ans;
}
}