你現在是棒球比賽記錄員。 給定一個字元串列表,每個字元串可以是以下四種類型之一:1.整數(一輪的得分):直接表示您在本輪中獲得的積分數。2. "+"(一輪的得分):表示本輪獲得的得分是前兩輪有效 回合得分的總和。3. "D"(一輪的得分):表示本輪獲得的得分是前一輪有效 回合得分的兩倍。4. "C" ...
你現在是棒球比賽記錄員。
給定一個字元串列表,每個字元串可以是以下四種類型之一:
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