-
Notifications
You must be signed in to change notification settings - Fork 176
Expand file tree
/
Copy pathBaseball Game.java
More file actions
86 lines (79 loc) · 3.46 KB
/
Baseball Game.java
File metadata and controls
86 lines (79 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
You're now a baseball game point recorder.
Given a list of strings, each string can be one of the 4 following types:
Integer (one round's score): Directly represents the number of points you get in this round.
"+" (one round's score): Represents that the points you get in this round are the sum of the last two valid round's points.
"D" (one round's score): Represents that the points you get in this round are the doubled data of the last valid round's points.
"C" (an operation, which isn't a round's score): Represents the last valid round's points you get were invalid and should be removed.
Each round's operation is permanent and could have an impact on the round before and the round after.
You need to return the sum of the points you could get in all the rounds.
Example 1:
Input: ["5","2","C","D","+"]
Output: 30
Explanation:
Round 1: You could get 5 points. The sum is: 5.
Round 2: You could get 2 points. The sum is: 7.
Operation 1: The round 2's data was invalid. The sum is: 5.
Round 3: You could get 10 points (the round 2's data has been removed). The sum is: 15.
Round 4: You could get 5 + 10 = 15 points. The sum is: 30.
Example 2:
Input: ["5","-2","4","C","D","9","+","+"]
Output: 27
Explanation:
Round 1: You could get 5 points. The sum is: 5.
Round 2: You could get -2 points. The sum is: 3.
Round 3: You could get 4 points. The sum is: 7.
Operation 1: The round 3's data is invalid. The sum is: 3.
Round 4: You could get -4 points (the round 3's data has been removed). The sum is: -1.
Round 5: You could get 9 points. The sum is: 8.
Round 6: You could get -4 + 9 = 5 points. The sum is 13.
Round 7: You could get 9 + 5 = 14 points. The sum is 27.
Note:
The size of the input list will be between 1 and 1000.
Every integer represented in the list will be between -30000 and 30000.
*/
/**
* Approach: Stack
* 根据题目的意思,我们需要操作的值是 前一个或者前两个 的有效分值。
* 涉及到类似运算的第一反应就是使用 栈 来进行模拟操作。
* 因为它可以非常方便地模拟这个运算过程。
* 并且对于操作 'C' 我们能够使用 pop() 来简单模拟,
* 唯一的问题就是 '+',不过我们只需要 pop 出来后重新 push 进去即可。
*
* Stack中的值从栈底到栈顶表示:从游戏开始到结束获得的有效分值顺序。
* 最后我们只需要将其全部 pop() 出来相加即可。
* 这里在代码的实现上使用了 Switch().因为默认题目的输入是合法且只有4中情况。
* 好一点的做法就是使用 if 来处理哈。
*
* 时间复杂度:O(n)
* 空间复杂度:O(n)
*/
class Solution {
public int calPoints(String[] ops) {
Stack<Integer> stack = new Stack<>();
for (String op : ops) {
switch (op) {
case "+":
int x = stack.pop();
int y = stack.pop();
stack.push(y);
stack.push(x);
stack.push(x + y);
break;
case "D":
stack.push(stack.peek() * 2);
break;
case "C":
stack.pop();
break;
default:
stack.push(Integer.valueOf(op));
}
}
int sum = 0;
while (!stack.isEmpty()) {
sum += stack.pop();
}
return sum;
}
}