leetcode之棒球比赛
程序员文章站
2022-07-15 12:22:13
...
棒球计分
题目描述:
你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
2. “+”(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
3. “D”(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
4. “C”(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。
每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。
示例 1:
输入: ["5","2","C","D","+"]
输出: 30
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。
第4轮:你可以得到5 + 10 = 15分。总数是:30。
示例 2:
输入: ["5","-2","4","C","D","9","+","+"]
输出: 27
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到-2分。总数是:3。
第3轮:你可以得到4分。总和是:7。
操作1:第3轮的数据无效。总数是:3。
第4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1。
第5轮:你可以得到9分。总数是:8。
第6轮:你可以得到-4 + 9 = 5分。总数是13。
第7轮:你可以得到9 + 5 = 14分。总数是27。
注意:
- 输入列表的大小将介于1和1000之间。
- 列表中的每个整数都将介于-30000和30000之间。
思路
首先输入一个数组 , 如果不满足前提要求则直接返回0 , 如果满足 , 则继续进行判断, 用一个栈去表示数组中每一个位置的分数 , 如果遇到字母"D", 则访问栈顶元素并乘2后放入栈中 , 注意原来的元素没有弹栈!如果遇到"+"时则访问(不是弹栈)栈的最上2个元素进行加操作后再放入栈顶 , 只有在遇到字母 "C"时, 则弹出栈顶元素 , 最后对栈内所有元素进行求和.
编程实现
class Solution {
private Stack<Integer> numStack = new Stack<Integer>();
public int calPoints(String[] ops) {
//判断长度是否超出题目要求
if(ops.length > 1000 || ops.length < 1){
return 0;
}
for (int i = 0; i<=ops.length-1 ; i++){
try{
int number = Integer.parseInt(ops[i]);
//判断数字大小是否超出题目要求
if(number > 30000 || number < -30000){
return 0;
}else{
numStack.push(number);
}
}catch(Exception ex){
//栈判空, 若为空, 则此次操作没有任何意义
if(numStack.empty()){
continue;
}
//不是数字, 会抛出异常, 此时不抛出, 作操作判断
switch (ops[i]){
case "C":
numStack.pop();
continue;
case "D":
Integer peek = numStack.peek();
numStack.push(peek*2);
continue;
case "+":
if(numStack.size() < 2){
numStack.push(numStack.peek());
}else{
Integer top = numStack.peek();
Integer second = numStack.get(numStack.size() - 2);
numStack.push(top+second);
}
continue;
default:
break;
}
}
}
//求和
int sum = 0;
for (Integer integer : numStack) {
sum += integer;
}
return sum;
}
}
下一篇: LeetCode 682棒球比赛
推荐阅读