Leetcode Top Interview โœจ
GithubLinkedinXOfficial Website
  • Leetcode Top Interview ๐ŸŽฏ
  • Guide to Calculating Algorithm Complexity ๐Ÿš€
  • Topic 1 Array - String
    • 88. Merge Sorted Arrays ๐Ÿงฉ
    • 27. Remove Element ๐Ÿงน
    • 26. Remove Duplicates from Sorted Array ๐Ÿšซ
    • 80. Remove Duplicates from Sorted Array II ๐Ÿšซ๐Ÿšซ
    • 169. Majority Element ๐Ÿ‘‘
    • 189. Rotate Array ๐Ÿ”„
    • 121. Best Time to Buy and Sell Stock ๐Ÿ“ˆ
    • 122. Best Time to Buy and Sell Stock II ๐Ÿ“ˆ๐Ÿ’ฐ
    • 55. Jump Game ๐Ÿƒโ€โ™‚๏ธ
    • 45. Jump Game II ๐Ÿƒโ€โ™‚๏ธ
    • 274. H-Index ๐Ÿ“Š
    • 380. Insert Delete GetRandom O(1) ๐ŸŽฒ
    • 238. Product of Array Except Self ๐Ÿ”„
    • 134. Gas Station โ›ฝ
    • 135. Candy ๐Ÿฌ
    • 42. Trapping Rain Water ๐ŸŒง๏ธ
    • 13. Roman to Integer ๐Ÿ”ข
    • 018 Integer to Roman
    • 58. Length of Last Word ๐Ÿ” 
    • 14. Longest Common Prefix ๐ŸŒฑ
    • 151. Reverse Words in a String ๐Ÿ”„
    • 6. Zigzag Conversion ๐Ÿ”€
    • 28. Find the Index of the First Occurrence in a String ๐Ÿ”„
    • 68. Text Justification ๐Ÿ”„
  • Topic 2 Two Pointers
    • 125. Valid Palindrome ๐Ÿšฆ
    • 392. Is Subsequence ๐Ÿ“
    • 167. Two Sum II - Input Array Is Sorted ๐Ÿ”
    • 11. Container With Most Water ๐Ÿž๏ธ
    • 15. 3Sum ๐ŸŒ
  • Topic 3 Sliding Window
    • 209. Minimum Size Subarray Sum ๐ŸŒ
    • 3. Longest Substring Without Repeating Characters ๐ŸŒ
    • 30. Substring with Concatenation of All Words ๐ŸŒ
    • 76. Minimum Window Substring ๐ŸŒ
  • Topic 4 Matrix
    • 36. Valid Sudoku ๐ŸŒ
    • 54. Spiral Matrix ๐ŸŒ
    • 48. Rotate Image ๐Ÿ”„
    • 73. Set Matrix Zeroes
    • 289. Game of Life ๐Ÿ–ผ๏ธ
  • Topic 5 Hashmap
    • 383. Ransom Note ๐Ÿ”
    • 205. Isomorphic Strings ๐Ÿ”
    • 290. Word Pattern ๐Ÿงฉ
    • 242. Valid Anagram ๐ŸŽข
    • 49. Group Anagrams ๐Ÿคนโ€โ™‚๏ธ
    • 1. Two Sum ๐Ÿ”
    • 202. Happy Number ๐Ÿคฉ
    • 219. Contains Duplicate II ๐Ÿ”
    • 128. Longest Consecutive Sequence ๐Ÿ”
  • Topic 6 Intervals
    • 228. Summary Ranges ๐Ÿ“Š
    • 56. Merge Intervals ๐Ÿ”€
    • 57. Insert Interval ๐Ÿ†•
    • 452. Minimum Number of Arrows to Burst Balloons ๐ŸŽˆ
  • Topic 7 Stack
    • 20. Valid Parentheses ๐Ÿ”
    • 71. Simplify Path ๐Ÿ—บ๏ธ
    • 155. Min Stack ๐Ÿ—ƒ๏ธ
    • 150. Evaluate Reverse Polish Notation ๐Ÿง ๐Ÿ’ป
    • 224. Basic Calculator ๐Ÿงฎ
  • Topic 8 Linked List
    • 141. Linked List Cycle ๐Ÿ”
    • 2. Add Two Numbers ๐Ÿ”ข
    • 21. Merge Two Sorted Lists ๐Ÿ”—
    • 138. Copy List with Random Pointer ๐Ÿ”—
    • 92. Reverse Linked List II ๐Ÿ”„
      • Letโ€™s explain step by step ๐Ÿ‡
    • 25. Reverse Nodes in k-Group ๐Ÿ”„
    • 19. Remove Nth Node From End of List ๐Ÿ—‘๏ธ
    • 82. Remove Duplicates from Sorted List II โŒ๐Ÿ”ข
    • 61. Rotate List ๐Ÿ”„
    • 86. Partition List ๐Ÿ”—
    • 146. LRU Cache ๐Ÿ”—
  • Topic 9 Binary Tree General
    • 104. Maximum Depth of Binary Tree ๐Ÿ”—
    • 100. Same Tree ๐Ÿ”—
    • 226. Invert Binary Tree ๐Ÿ”—
    • 101. Symmetric Tree ๐Ÿ”—
    • 105. Construct Binary Tree from Preorder and Inorder Traversal ๐Ÿ”—
    • 106. Construct Binary Tree from Inorder and Postorder Traversal ๐Ÿ”—
    • 117. Populating Next Right Pointers in Each Node II ๐Ÿ”—
    • 114. Flatten Binary Tree to Linked List ๐Ÿ”—
    • 112. Path Sum ๐Ÿ”—
    • 129. Sum Root to Leaf Numbers ๐Ÿ”—
      • What_is_DFS
    • 124. Binary Tree Maximum Path Sum ๐Ÿ”—
Powered by GitBook
On this page
  • Problem Statement ๐Ÿ“œ
  • Examples ๐ŸŒŸ
  • Constraints โš™๏ธ
  • Solution ๐Ÿ’ก
  • Approach:
  • Java Solution
  • Explanation of the Solution
  • Time Complexity โณ
  • Space Complexity ๐Ÿ’พ

Was this helpful?

  1. Topic 7 Stack

224. Basic Calculator ๐Ÿงฎ

Previous150. Evaluate Reverse Polish Notation ๐Ÿง ๐Ÿ’ปNextTopic 8 Linked List

Last updated 5 months ago

Was this helpful?

Difficulty: Hard - Tags: Stack, Mathematical Expression


Problem Statement ๐Ÿ“œ

Given a string s representing a valid expression, implement a basic calculator to evaluate it and return the result of the evaluation.

Constraints:

  • You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as eval().

Examples ๐ŸŒŸ

๐Ÿ”น Example 1:

Input:

s = "1 + 1"

Output:

2

๐Ÿ”น Example 2:

Input:

s = " 2-1 + 2 "

Output:

3

๐Ÿ”น Example 3:

Input:

s = "(1+(4+5+2)-3)+(6+8)"

Output:

23

Constraints โš™๏ธ

  • 1 <= s.length <= 3 * 10^5

  • s consists of digits, '+', '-', '(', ')', and spaces ' '.

  • s represents a valid expression.

  • '+' is not used as a unary operation (e.g., "+1" and "+(2 + 3)" are invalid).

  • '-' can be used as a unary operation (e.g., "-1" and "- (2 + 3)" are valid).

  • There will be no two consecutive operators in the input.

  • Every number and running calculation will fit in a signed 32-bit integer.


Solution ๐Ÿ’ก

To solve the problem, we need to handle:

  1. Parentheses: We need to evaluate expressions within parentheses first.

  2. Unary Minus: Handle negative numbers or expressions that start with a minus sign.

  3. Operators: Handle addition and subtraction between numbers.

We will use a stack to handle nested parentheses and the accumulation of results as we process the string.


Approach:

  1. Iterate through the string:

    • If we encounter a number, accumulate it and push it onto the stack.

    • If we encounter an operator (+ or -), record it for the next number.

    • If we encounter a parenthesis (, push the current result and operator onto the stack and start a new scope.

    • If we encounter a closing parenthesis ), calculate the result for that scope and return to the previous context.

  2. Handle each number:

    • Consider negative numbers and numbers with multiple digits.

  3. Handle operators:

    • For each operator, perform the addition or subtraction with the previous number or the current number if no previous number exists.


Java Solution

import java.util.Stack;

class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        int result = 0, sign = 1, num = 0; // result = accumulated result, sign = current sign (+ or -)

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0'); // Build the number digit by digit
            } else if (c == '+') {
                result += sign * num; // Add the current number to the result
                num = 0; // Reset the number for the next iteration
                sign = 1; // Set the sign to + for the next number
            } else if (c == '-') {
                result += sign * num; // Add the current number to the result
                num = 0; // Reset the number for the next iteration
                sign = -1; // Set the sign to - for the next number
            } else if (c == '(') {
                stack.push(result); // Save the current result before going into the parentheses
                stack.push(sign); // Save the current sign
                result = 0; // Reset the result for the new expression inside parentheses
                sign = 1; // Reset the sign for the new expression
            } else if (c == ')') {
                result += sign * num; // Add the current number to the result
                num = 0; // Reset the number
                result *= stack.pop(); // Apply the sign from the last '('
                result += stack.pop(); // Add the previous result from before '('
            }
        }

        if (num != 0) { // Add the last number if any
            result += sign * num;
        }

        return result;
    }
}

Explanation of the Solution

  1. Building the Number: As we iterate through the string, we build numbers by accumulating digits.

  2. Sign Management: When encountering a + or -, we set the sign accordingly. If it's +, we add the current number to the result; if it's -, we subtract it.

  3. Parentheses Handling:

    • When encountering a (, we push the current result and sign onto the stack and reset them for the new expression inside the parentheses.

    • When encountering a ), we complete the evaluation of the expression inside the parentheses by applying the sign and adding the result to the previous context.

  4. Final Calculation: After the loop, we add any remaining number to the result.


Time Complexity โณ

  • O(n): We iterate over the string once, where n is the length of the string.

Space Complexity ๐Ÿ’พ

  • O(n): In the worst case, we might need space for the stack that stores the results and signs of nested parentheses.

You can find the full solution .

LeetCode Problem Link
here