Skip to content

Latest commit

 

History

History
115 lines (89 loc) · 2.76 KB

227-basic-calculator-ii.md

File metadata and controls

115 lines (89 loc) · 2.76 KB

给你一个字符串表达式 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 整数

Solutions

1. 先分解成数字和运算符数组,再用栈计算

1048. 笨阶乘 类似.

class Solution:
    def calculate(self, s: str) -> int:
        
        vs = [0]
        for v in s:
            if v == ' ':
                continue

            if v in ['+', '-', '*', '/']:
                vs.append(v)
                vs.append(0)
            else:
                vs[-1] *= 10
                vs[-1] += int(v)

        st = [vs[0]]
        i = 1
        while i < len(vs):
            n = vs[i]
            if n == '+':
                st.append(vs[i + 1])
            elif n == '-':
                st.append(-vs[i + 1])
            elif n == '*':
                st[-1] *= vs[i + 1]
            elif n == '/':
                st[-1] = int(st[-1] / vs[i + 1])
            i += 2

        return sum(st)

参考题解,一遍遍历计算结果

class Solution:
    def calculate(self, s: str) -> int:
        n = len(s)
        vs = []

        preSign = '+'
        num = 0
        for i in range(n):
            if s[i] != ' ' and s[i] not in '+-*/':
                num *= 10
                num += int(s[i])
            # 最后一次 i == n 时,也要走这个分支
            if i == n - 1 or s[i] in '+-*/':
                if preSign == '+':
                    vs.append(num)
                elif preSign == '-':
                    vs.append(-num)
                elif preSign == '*':
                    vs[-1] *= num
                else:
                    vs[-1] = int(vs[-1] / num)
                preSign = s[i]
                num = 0

        return sum(vs)