0%

LeetCode-224

题目

224. 基本计算器

结果

代码

思路就一句话:遇到括号,先计算括号里面的值,再该干嘛干嘛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
func calculate(s string) int {
s = strings.ReplaceAll(s, " ", "")
stk := make([]rune, 0)
// s only contains num and '+' '-'
for _, v := range s {
if v != ')' {
stk = append(stk, v)
continue
}

// when encounter a ')'
var bf bytes.Buffer
for {
top := stk[len(stk)-1]
// stack pop
stk = stk[:len(stk)-1]
if top == '(' {
break
}
bf.WriteRune(top)
}

val := simpleCalculate(reverse(bf.String()))
for _, vv := range val {
stk = append(stk, vv)
}
}
ans, err := strconv.Atoi(simpleCalculate(string(stk)))
if err != nil {
panic(err)
}
return ans
}

func simpleCalculate(expr string) string {
// handle negative number
expr = strings.ReplaceAll(expr, "--", "+")
expr = strings.ReplaceAll(expr, "+-", "-")

stk := make([]int, 0)
num := 0
opt := '+'

for i, v := range expr {
if unicode.IsDigit(v) {
num = num*10 + int(v-'0')
}
if isOpt(v) || i == len(expr)-1 {
switch opt {
case '+':
stk = append(stk, num)
case '-':
stk = append(stk, -num)
}
num = 0
opt = v
}
}
return strconv.Itoa(sum(stk))
}

func isOpt(ch rune) bool {
opts := "+-*/"
return strings.Contains(opts, string(ch))
}

func sum(nums []int) int {
ans := 0
for _, v := range nums {
ans += v
}
return ans
}

// reverse string
func reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}

复杂度

时间复杂度:O(n),虽然有很多循环,但都是线性的复杂度

空间复杂度:O(n)