[每日算法] 基本计算器②

RoLingG 算法 2026-05-27

每日算法 基本计算器②

例题:227. 基本计算器 II

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

示例 1:

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

示例 2:

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

示例 3:

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

这道题也能用完整一些的 https://leetcode.cn/problems/basic-calculator/description/ 题解去做,之所以②变成了中等题就是因为不用考虑 ( ) 的处理了,使得优先处理的二维边界消失了,就简单了很多。

package main

import "fmt"

func calculate1(s string) int {
    preSign := '+'
    num := 0
    res := 0
    storage := make([]int, 0)

    for i, ch := range s {
       isDigit := '0' <= ch && ch <= '9'
       if isDigit {
          num = num*10 + int(ch-'0')
       }
       // 遇到下一个运算符时或者到了结尾(Go 的运算符优先级:&& 高于 ||)
       // if (!isDigit && ch != ' ') || i == len(s)-1 {
       if !isDigit && ch != ' ' || i == len(s)-1 {
          // 乘除法当即计算,这样就不需要考虑四则运算乘除优先级了
          switch preSign {
          case '+':
             storage = append(storage, num)
          case '-':
             storage = append(storage, -num)
          case '*':
             storage[len(storage)-1] *= num // 乘法,当即计算
          case '/':
             storage[len(storage)-1] /= num // 除法,当即计算
          }
          preSign = ch
          num = 0
       }
    }
    for _, v := range storage {
       res += v
    }
    return res
}

func main() {
    res1 := calculate1("1 + 1")
    fmt.Println(res1)
    res2 := calculate1("1 + 3 - 5 * 8 + 4 / 2")
    fmt.Println(res2)
}

难度下降到甚至直接处理乘除之后,直接计算加减就好了,连栈的思维都不用了。

PREV
[Golang] Fedora上运行Wails构建出现libwebkit缺失问题
NEXT
[每日算法] 基本计算器

评论(0)

发布评论