[Day48]-[递归]- 基本计算器 II
作者:方勇(gopher)
- 2022 年 5 月 29 日
本文字数:880 字
阅读完需:约 3 分钟
227. 基本计算器 II
给你一个字符串表达式
s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在
[-231, 231 - 1]的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如
eval()。
示例 1:
输入:s = "3+2*2"输出:7
复制代码
示例 2:
输入:s = " 3/2 "输出:1
复制代码
示例 3:
输入:s = " 3+5 / 2 "输出:5
复制代码
题解:
func TestCalculate(t *testing.T) { var s = "34-(2*2)+1" var helper func() int var sum func(stack []int) int sum = func(stack []int) int { ans := 0 for len(stack) > 0 { ans += stack[0] stack = stack[1:] } return ans } helper = func() int { var stack []int var num int var sign = '+' for len(s) > 0 { // 这里的s是全局的,处理一个字符少一个 c := s[0] // 每次弹出一个字符 s = s[1:] // 弹出字符 if unicode.IsDigit(rune(c)) { // 如果是数字 继续读取 num = num*10 + int(c-'0') // 转成数字 } if c == '(' { // 遇到括号继续递归 num = helper() // 开始递归 } // 遇到符号 或者 循环到结尾 处理上一个符号 if (!unicode.IsDigit(rune(c)) && c != ' ') || len(s) == 0 { switch sign { // sign 为上一个 符号 初始化为+ case '+': stack = append(stack, num) // +num case '-': stack = append(stack, -num) // -num case '*': pre := stack[len(stack)-1] // 栈顶 stack = stack[:len(stack)-1] // 弹出栈 stack = append(stack, pre*num) // 计算'*' case '/': pre := stack[len(stack)-1] // 栈顶 stack = stack[:len(stack)-1] // 弹出栈 stack = append(stack, pre/num) // 计算'/' } sign, num = rune(c), 0 // 归位 符号 和 num } if c == ')' { // 括号递归终止条件 break } } return sum(stack) // 返回结果集 }
t.Log(helper())}复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!










评论