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

177 阅读1分钟

题目地址

leetcode-cn.com/problems/ba…

题目描述

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

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

1 <= s.length <= 3 * 105
s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数

题解

利用栈,存储 + 或者 - 后面的值,然后求和就行了

class Solution {
    public int calculate(String s) {

        char[] array = s.toCharArray();

        Deque<Integer> stack = new LinkedList<>();

        int i = 0;
        while (i < array.length) {
            if (array[i] == ' ') {
                i++;
                continue;
            }
            int j = i;
            if (array[j] == '+' || array[j] == '-' || array[j] == '*' || array[j] == '/') {
                j++;
                while (j < array.length) {
                    if (array[j] == ' ') {
                        j++;
                        continue;
                    } else {
                        break;
                    }
                }
            }
            int number = 0;
            while (j < array.length) {
                if (array[j] >= '0' && array[j] <= '9') {
                    number = number * 10 + (array[j] - '0');
                    j++;
                } else {
                    break;
                }
            }
            if (array[i] == '+') {
                stack.offerLast(number);
            } else if (array[i] == '-') {
                stack.offerLast(-number);
            } else if (array[i] == '*') {
                stack.offerLast(stack.pollLast() * number);
            } else if (array[i] == '/') {
                stack.offerLast(stack.pollLast() / number);
            } else {
                stack.offerLast(number);
            }
            i = j;
        }
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pollLast();
        }

        return result;
    }
}

复杂度分析

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

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