你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
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之间。
根据此题掌握数据结构中栈的使用
题目分析:棒球比赛的时候,每一轮都会得分,此时有3种操作,相应的操作会改变本轮的得分,处理完后,将每轮的得分加起来就是要得出的结果。
那么此题也很明显可以用栈的操作来实现:扫描字符数组,当扫描到的字符是数字的时候,入栈;但扫描到的字符是’+’,‘C’,'D’的时候按照要求对得分进行操作,最后将栈中的数加起来就是得分。
有很多运用栈的技巧小细节:
1.要实现’+'的功能,这需要获取栈中的最顶部两个元素,这就需要连着运用两次pop()操作,取出数,存储,之后再将这两个数和他们的和入栈;
一定要注意,在将原先的两个数入栈的时候,一定要先入栈第二个元素,这样顺序才不会错,栈是先进后出的表。
if (s.equals("+"))
{
int nums1 = stack.pop();
int nums2 = stack.pop();
stack.push(nums2);
stack.push(nums1);
stack.push(nums1 + nums2);
}
2.实现’C’的功能,则直接运用pop()操作:
else if (s.equals("C"))
{
stack.pop();
}
3.实现’D’的功能,则也需要现将栈顶元素出栈,存储,然后将取出的数和此数的2倍入栈,顺序也一定是先入栈取出的数,在入栈次数的2倍。
else if (s.equals("D"))
{
int num = stack.pop();
stack.push(num);
stack.push(num * 2);
}
4.最后总得分的时候,如何获取栈中的元素?这里只需要利用while()循环,只要stack不空,则运用pop()取出栈顶元素相加即可。
int sum = 0;
while (!stack.isEmpty())
{
sum += stack.pop();
}
return sum;
实现代码:
public int calPoints(String[] ops)
{
Stack<Integer> stack = new Stack<>();
for (String s : ops)
{
if (s.equals("+"))
{
int nums1 = stack.pop();
int nums2 = stack.pop();
stack.push(nums2);
stack.push(nums1);
stack.push(nums1 + nums2);
}
else if (s.equals("C"))
{
stack.pop();
}
else if (s.equals("D"))
{
int num = stack.pop();
stack.push(num);
stack.push(num * 2);
}
else
stack.push(Integer.parseInt(s));
}
int sum = 0;
while (!stack.isEmpty())
{
sum += stack.pop();
}
return sum;
}
主函数:
public static void main(String[] args)
{
T7 t = new T7();
int end = t.calPoints(new String[]{"5","-2","4","C","D","9","+","+"});
System.out.println(end);
}
运行结果:
27