【做题也是一场游戏】224. 基本计算器

215 阅读1分钟

题目地址

leetcode-cn.com/problems/ba…

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

1 <= s.length <= 3 * 105
s 由数字、'+''-''('')'、和 ' ' 组成
s 表示一个有效的表达式

题解

由于只有加减和括号,遇到括号直接展开就行了, 需要用栈记录括号前的是加还是减

class Solution {
    public int calculate(String s) {
        Deque<Integer> signStack = new LinkedList<>();
        signStack.offerLast(1);
        int result = 0;
        int sign = 1;

        char[] array = s.toCharArray();
        int i = 0;
        while (i < array.length) {
            if (array[i] == ' ') {
                i++;
            } else if (array[i] == '+') {
                sign = signStack.peekLast();
                i++;
            } else if (array[i] == '-') {
                sign = -signStack.peekLast();
                i++;
            } else if (array[i] == '(') {
                signStack.offerLast(sign);
                i++;
            } else if (array[i] == ')') {
                sign = signStack.pollLast();
                i++;
            } else {
                int number = 0;
                while (i < array.length && array[i] >= '0' && array[i] <= '9') {
                    number = number * 10 + (array[i] - '0');
                    i++;
                }
                result = result + sign * number;
            }
        }

        return result;
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 nn 为字符串 ss 的长度。需要遍历字符串 ss 一次,计算表达式的值。

  • 空间复杂度:O(n)O(n),其中 nn 为字符串 ss 的长度。空间复杂度主要取决于栈的空间,栈中的元素数量不超过 nn