mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 08:27:30 +08:00
80 lines
2.2 KiB
Markdown
80 lines
2.2 KiB
Markdown
# [227. Basic Calculator II](https://leetcode.com/problems/basic-calculator-ii/)
|
||
|
||
|
||
## 题目
|
||
|
||
Given a string `s` which represents an expression, *evaluate this expression and return its value*.
|
||
|
||
The integer division should truncate toward zero.
|
||
|
||
**Example 1:**
|
||
|
||
```
|
||
Input: s = "3+2*2"
|
||
Output: 7
|
||
```
|
||
|
||
**Example 2:**
|
||
|
||
```
|
||
Input: s = " 3/2 "
|
||
Output: 1
|
||
```
|
||
|
||
**Example 3:**
|
||
|
||
```
|
||
Input: s = " 3+5 / 2 "
|
||
Output: 5
|
||
```
|
||
|
||
**Constraints:**
|
||
|
||
- `1 <= s.length <= 3 * 10^5`
|
||
- `s` consists of integers and operators `('+', '-', '*', '/')` separated by some number of spaces.
|
||
- `s` represents **a valid expression**.
|
||
- All the integers in the expression are non-negative integers in the range `[0, 2^31 - 1]`.
|
||
- The answer is **guaranteed** to fit in a **32-bit integer**.
|
||
|
||
## 题目大意
|
||
|
||
给你一个字符串表达式 `s` ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
|
||
|
||
## 解题思路
|
||
|
||
- 这道题是第 224 题的加强版。第 224 题中只有加减运算和括号,这一题增加了乘除运算。由于乘除运算的优先级高于加减。所以先计算乘除运算,将算出来的结果再替换回原来的算式中。最后只剩下加减运算,于是题目降级成了第 224 题。
|
||
- 把加减运算符号后面的数字压入栈中,遇到乘除运算,直接将它与栈顶的元素计算,并将计算后的结果放入栈顶。若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新 `preSign` 为当前遍历的字符。遍历完字符串 `s` 后,将栈中元素累加,即为该字符串表达式的值。时间复杂度 O(n),空间复杂度 O(n)。
|
||
|
||
## 代码
|
||
|
||
```go
|
||
package leetcode
|
||
|
||
func calculate(s string) int {
|
||
stack, preSign, num, res := []int{}, '+', 0, 0
|
||
for i, ch := range s {
|
||
isDigit := '0' <= ch && ch <= '9'
|
||
if isDigit {
|
||
num = num*10 + int(ch-'0')
|
||
}
|
||
if !isDigit && ch != ' ' || i == len(s)-1 {
|
||
switch preSign {
|
||
case '+':
|
||
stack = append(stack, num)
|
||
case '-':
|
||
stack = append(stack, -num)
|
||
case '*':
|
||
stack[len(stack)-1] *= num
|
||
default:
|
||
stack[len(stack)-1] /= num
|
||
}
|
||
preSign = ch
|
||
num = 0
|
||
}
|
||
}
|
||
for _, v := range stack {
|
||
res += v
|
||
}
|
||
return res
|
||
}
|
||
``` |