棒球比赛

你现在是棒球比赛记录员。


给定一个字符串列表,每个字符串可以是以下四种类型之一:
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()操作,取出数,存储,之后再将这两个数和他们的和入栈;

一定要注意,在将原先的两个数入栈的时候,一定要先入栈第二个元素,这样顺序才不会错,栈是先进后出的表。

1 if (s.equals("+"))
2 {
3     int nums1 = stack.pop();
4     int nums2 = stack.pop();
5     stack.push(nums2);
6     stack.push(nums1);
7     stack.push(nums1 + nums2);
8  }

2.实现'C'的功能,则直接运用pop()操作:

1 else if (s.equals("C"))
2  {
3        stack.pop();
4  }

3.实现'D'的功能,则也需要现将栈顶元素出栈,存储,然后将取出的数和此数的2倍入栈,顺序也一定是先入栈取出的数,在入栈次数的2倍。

1 else if (s.equals("D"))
2 {
3      int num = stack.pop();
4      stack.push(num);
5      stack.push(num * 2);
6 }

4.最后总得分的时候,如何获取栈中的元素?这里只需要利用while()循环,只要stack不空,则运用pop()取出栈顶元素相加即可。

1 int sum = 0;
2 while (!stack.isEmpty())
3 {
4      sum += stack.pop();
5 }
6 return sum;

 

实现代码:

 1 public int calPoints(String[] ops)
 2     {
 3         Stack<Integer> stack = new Stack<>();
 4 
 5         for (String s : ops)
 6         {
 7             if (s.equals("+"))
 8             {
 9                 int nums1 = stack.pop();
10                 int nums2 = stack.pop();
11                 stack.push(nums2);
12                 stack.push(nums1);
13                 stack.push(nums1 + nums2);
14             }
15 
16             else if (s.equals("C"))
17             {
18                 stack.pop();
19             }
20 
21             else if (s.equals("D"))
22             {
23                 int num = stack.pop();
24                 stack.push(num);
25                 stack.push(num * 2);
26             }
27 
28             else
29                 stack.push(Integer.parseInt(s));
30         }
31 
32         int sum = 0;
33         while (!stack.isEmpty())
34         {
35             sum += stack.pop();
36         }
37         return sum;
38     }

 

主函数:

1 public static void main(String[] args)
2     {
3         T7 t = new T7();
4         int end = t.calPoints(new String[]{"5","-2","4","C","D","9","+","+"});
5         System.out.println(end);
6     }

 

运行结果:

1 27

 

posted @ 2018-09-21 23:31  GilfoyleWSW  阅读(180)  评论(0编辑  收藏  举报