224. 基本计算器

题目#

给你一个字符串表达式 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 表示一个有效的表达式

思路#

由于表达式中只存在加减法与括号,可以将表达式展开为纯加法运算(消括号,减法变成负数的加法),知乎就能得到结果了。

代码#

import "unicode"
func calculate(s string) int {
// 存 +/-
ops := []int{1}
// 展开括号时,需不需要 *-1
sign := 1
ans := 0
n := len(s)
// 遍历处理
for i := 0; i < n; {
switch s[i] {
case ' ':
i++
case '+':
sign = ops[len(ops)-1]
i++
case '-':
sign = -ops[len(ops)-1]
i++
// 出现括号时,需要把符号加到 ops 里
case '(':
ops = append(ops, sign)
i++
case ')':
ops = ops[:len(ops)-1]
i++
default:
// 处理数字
num := 0
for ; i < n && unicode.IsDigit(rune(s[i])); i++ {
num = num*10 + int(s[i]-'0')
}
ans += sign * num
}
}
return ans
}
Last updated on