【剑指offer】表达式求值 [Go语言]

289 阅读2分钟

描述

请写一个整数计算器,支持加减乘三种运算和括号。\

数据范围:0≤∣s∣≤100,保证计算结果始终在整型范围内\

要求:空间复杂度: O(n),时间复杂度 O(n)

示例1

输入:

"1+2"

返回值:

3

示例2

输入:

"(2*(3-4))*5"

返回值:

-10

示例3

输入:

"3+2*3*4-1"

返回值:

26

思路

这是一个表达式,我们可以先把括号里面的值算出来,就是遇到括号就递归调用,并不断从内到外。

AC Code

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
*/
func solve( s string ) int {
    // write code here
    return compose(s)
}

func compose(s string) int {
    stack := []int{}
    var sign byte = '+'
    num:=0
    for len(s)>0{
        ch:=s[0]
        s = s[1:]
        if ch == ' '&& len(s)!=0{
            continue
        }
(1)        if ch == '('{
            i,count := 0,1
(2)            for count>0{
(3)                if s[i]=='('{
(4)                    count++
(5)                }
(6)                if s[i]==')'{
(7)                    count--
                }
(8)                i++
            }
(9)            num = compose(s[0:i-1])
(10)            s = s[i:]
            if len(s)!=0{
                continue
            }
        }
(11)        if ch>='0' && ch<='9'{
(12)            num = 10*num+int(ch-'0')
            if len(s)!=0{
                continue
            }
        }
(13)        switch sign{
            case '+':
                stack = append(stack, num)
            case '-':
                stack = append(stack, -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)
        }
(14)        sign, num = ch, 0
    }
    ans := 0
(15)    for _, v := range stack {
        ans += v
    }
(16)    return ans
}
  • (1) 如果是左括号的话,就先进行记录并且进行计算
  • (2) 不断进行遍历,找到最里面的括号
  • (3) 如果还有左括号
  • (4) count数就自增
  • (6) 如果是右括号
  • (7) count数就自减
  • (8) i就可以自增
  • (9) 找到第一个不是括号的数
  • (10) 剪裁字符串
  • (11) 如果这个字符在0-9之间
  • (12) 就进行计算
  • (13) 这里进行一系列的符号计算
  • (14) 信号,数组重新定义并计算
  • (15) 遍历这个stack并进行计算相加
  • (16) 返回这个ans