All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0201_0300.s0227_basic_calculator_ii.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0201_0300.s0227_basic_calculator_ii;

// #Medium #Top_Interview_Questions #String #Math #Stack #Level_2_Day_18_Stack
// #2022_07_04_Time_8_ms_(95.32%)_Space_43.6_MB_(79.36%)

/**
 * 227 - Basic Calculator II\.
 *
 * Medium
 *
 * Given a string `s` which represents an expression, _evaluate this expression and return its value_.
 *
 * The integer division should truncate toward zero.
 *
 * You may assume that the given expression is always valid. All intermediate results will be in the range of [-231, 231 - 1].
 *
 * **Note:** You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as `eval()`.
 *
 * **Example 1:**
 *
 * **Input:** s = "3+2\*2"
 *
 * **Output:** 7 
 *
 * **Example 2:**
 *
 * **Input:** s = " 3/2 "
 *
 * **Output:** 1 
 *
 * **Example 3:**
 *
 * **Input:** s = " 3+5 / 2 "
 *
 * **Output:** 5 
 *
 * **Constraints:**
 *
 * *   1 <= s.length <= 3 * 105
 * *   `s` consists of integers and operators `('+', '-', '*', '/')` separated by some number of spaces.
 * *   `s` represents **a valid expression**.
 * *   All the integers in the expression are non-negative integers in the range [0, 231 - 1].
 * *   The answer is **guaranteed** to fit in a **32-bit integer**.
**/
public class Solution {
    public int calculate(String s) {
        int sum = 0;
        int tempSum = 0;
        int num = 0;
        char lastSign = '+';
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                num = num * 10 + c - '0';
            }
            // i == s.length() - 1 will make sure that after last num is
            // made and there is nothing to read anything from 's', the final computation is done
            if (i == s.length() - 1 || !Character.isDigit(c) && c != ' ') {
                switch (lastSign) {
                    case '+':
                        sum += tempSum;
                        tempSum = num;
                        break;
                    case '-':
                        sum += tempSum;
                        tempSum = -num;
                        break;
                    case '*':
                        tempSum *= num;
                        break;
                    case '/':
                        if (num != 0) {
                            tempSum /= num;
                        }
                        break;
                    default:
                        break;
                }
                lastSign = c;
                num = 0;
            }
        }
        // finally, add tempSum to sum
        sum += tempSum;
        return sum;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy