每日算法 基本计算器②
例题: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)
}难度下降到甚至直接处理乘除之后,直接计算加减就好了,连栈的思维都不用了。
RoLingG | 博客
评论(0)