描述
请写一个整数计算器,支持加减乘三种运算和括号。\
数据范围: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