You are keeping the scores for a baseball game with strange rules. At the beginning of the game, you start with an empty record.

You are 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:

Return the sum of all the scores on the record after applying all the operations.

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.

Input: ops = ["5","2","C","D","+"]
Output: 30
Explanation:
"5" - Add 5 to the record, record is now [5].
"2" - Add 2 to the record, record is now [5, 2].
"C" - Invalidate and remove the previous score, record is now [5].
"D" - Add 2 * 5 = 10 to the record, record is now [5, 10].
"+" - Add 5 + 10 = 15 to the record, record is now [5, 10, 15].
The total sum is 5 + 10 + 15 = 30.
Input: ops = ["5","-2","4","C","D","9","+","+"]
Output: 27
Explanation:
"5" - Add 5 to the record, record is now [5].
"-2" - Add -2 to the record, record is now [5, -2].
"4" - Add 4 to the record, record is now [5, -2, 4].
"C" - Invalidate and remove the previous score, record is now [5, -2].
"D" - Add 2 * -2 = -4 to the record, record is now [5, -2, -4].
"9" - Add 9 to the record, record is now [5, -2, -4, 9].
"+" - Add -4 + 9 = 5 to the record, record is now [5, -2, -4, 9, 5].
"+" - Add 9 + 5 = 14 to the record, record is now [5, -2, -4, 9, 5, 14].
The total sum is 5 + -2 + -4 + 9 + 5 + 14 = 27.
Input: ops = ["1","C"]
Output: 0
Explanation:
"1" - Add 1 to the record, record is now [1].
"C" - Invalidate and remove the previous score, record is now [].
Since the record is empty, the total sum is 0.
Constraints:

Contents

In this approach, we are going to use a Stack datastructure to store elements, and perform input operations.

Implementation steps:
package io.cscode.algorithms.stack; import java.util.Stack; public class BaseballGame { static int calPoints(String[] operations) { Stack<Integer> stack = new Stack<>(); for (String op: operations) { if("+".equals(op)) { // record a new score, sum of two previous scores if(stack.size()>=2) { int x1 = stack.pop(); int x2 = stack.peek(); int newRecord = x1+x2; stack.push(x1); stack.push(newRecord); } } else if ("D".equals(op)) { // record a new score, that is double of previous element if(stack.size()>=1) { stack.push(stack.peek() *2); } } else if ("C".equals(op)) { //invalidate previous if(stack.size()>=1) { stack.pop(); } } else { stack.push(Integer.parseInt(op)); } } int total = 0; for(Integer num: stack) { total += num; } return total; } public static void main(String[] args) { System.out.println(calPoints(new String[]{"5","2","C","D","+"})); System.out.println(calPoints(new String[]{"5","-2","4","C","D","9","+","+"})); System.out.println(calPoints(new String[]{"1","C"})); } }
Complexity Analysis:

Time complexity: Above code runs in O(n) time where n is the length of input string arrayoperations.
Space complexity: O(n), since we are storing operation elements into a Stack.

Above implementations source code can be found at GitHub link for Java code