You are keeping the scores for a baseball game with strange rules. At the beginning of the game, you start with an empty record.
Given a list of strings operations, where operations[i] is the ith operation you must apply to the record and is one of the following:
An integer x: Record a new score of x.
'+': Record a new score that is the sum of the previous two scores.
'D': Record a new score that is the double of the previous score.
'C': Invalidate the previous score, removing it from the record.
Return the sum of all the scores on the record after applying all the operations.
Note: The test cases are generated such that the answer and all intermediate calculations fit in a 32-bit integer and that all operations are valid.
Example 1:
Input: ops = ["1","2","+","C","5","D"]
Output: 18Explanation:
"1" - Add 1 to the record, record = [1]."2" - Add 2 to the record, record = [1, 2]."+" - Add 1 + 2 = 3 to the record, record = [1, 2, 3]."C" - Invalidate and remove the previous score, record = [1, 2]."5" - Add 5 to the record, record = [1, 2, 5]."D" - Add 2 * 5 = 10 to the record, record = [1, 2, 5, 10].1 + 2 + 5 + 10 = 18.Example 2:
Input: ops = ["5","D","+","C"]
Output: 15Explanation:
"5" - Add 5 to the record, record = [5]."D" - Add 2 * 5 = 10 to the record, record = [5, 10]."+" - Add 5 + 10 = 15 to the record, record = [5, 10, 15]."C" - Invalidate and remove the previous score, record = [5, 10].5 + 10 = 15.Constraints:
1 <= operations.length <= 1000operations[i] is "C", "D", +, or a string representing an integer in the range [(-30,000), (30,000)]."+", there will always be at least two previous scores on the record."C" and "D", there will always be at least one previous score on the record.Before attempting this problem, you should be comfortable with:
A stack is perfect for this problem because each operation depends on the most recent scores. When we see +, we need the last two scores. When we see D, we need the last score. When we see C, we need to remove the last score. A stack gives us efficient access to these recent elements.
+, add the sum of the top two elements to the stack.D, add double the top element to the stack.C, pop the top element.class Solution:
def calPoints(self, operations: List[str]) -> int:
stack = []
for op in operations:
if op == "+":
stack.append(stack[-1] + stack[-2])
elif op == "D":
stack.append(2 * stack[-1])
elif op == "C":
stack.pop()
else:
stack.append(int(op))
return sum(stack)This approach is similar to the first one, but we maintain a running total as we process operations instead of computing the sum at the end. Whenever we add a score, we add it to our result. When we remove a score with C, we subtract it. This gives us the same answer but avoids a final pass through the stack.
0.+, calculate the sum of the top two elements, push it, and add to result.D, calculate double the top element, push it, and add to result.C, pop the top element and subtract it from result.class Solution:
def calPoints(self, operations: List[str]) -> int:
stack, res = [], 0
for op in operations:
if op == "+":
res += stack[-1] + stack[-2]
stack.append(stack[-1] + stack[-2])
elif op == "D":
res += (2 * stack[-1])
stack.append(2 * stack[-1])
elif op == "C":
res -= stack.pop()
else:
res += int(op)
stack.append(int(op))
return resWhen the operation is a number, it comes as a string. Forgetting to parse it as an integer causes type errors or incorrect arithmetic.
# Wrong: pushing string instead of integer
stack.append(op) # op is "5", not 5The + operation requires adding the last two scores. When popping, the first pop gives the most recent score, and the second pop gives the one before it. Getting this order confused can lead to wrong results when the operation depends on position.