Skip to content

Commit c959c80

Browse files
committed
feat: add solutions to lc problem: No.0227
No.0227.Basic Calculator II
1 parent 8a1a0ea commit c959c80

File tree

6 files changed

+337
-143
lines changed

6 files changed

+337
-143
lines changed

solution/0200-0299/0227.Basic Calculator II/README.md

Lines changed: 120 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,18 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
遍历字符串 s,并用变量 `preSign` 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据 `preSign` 来决定计算方式:
56+
**方法一:栈**
57+
58+
遍历字符串 $s$,并用变量 `sign` 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据 `sign` 来决定计算方式:
5759

5860
- 加号:将数字压入栈;
5961
- 减号:将数字的相反数压入栈;
6062
- 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
6163

64+
遍历结束后,将栈中元素求和即为答案。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $s$ 的长度。
67+
6268
<!-- tabs:start -->
6369

6470
### **Python3**
@@ -68,27 +74,25 @@
6874
```python
6975
class Solution:
7076
def calculate(self, s: str) -> int:
71-
num, n = 0, len(s)
72-
pre_sign = '+'
73-
stack = []
74-
for i in range(n):
75-
if s[i].isdigit():
76-
num = num * 10 + int(s[i])
77-
if i == n - 1 or (not s[i].isdigit() and s[i] != ' '):
78-
if pre_sign == '+':
79-
stack.append(num)
80-
elif pre_sign == '-':
81-
stack.append(-num)
82-
elif pre_sign == '*':
83-
stack.append(stack.pop() * num)
84-
else:
85-
stack.append(int(stack.pop() / num))
86-
pre_sign = s[i]
87-
num = 0
88-
res = 0
89-
while stack:
90-
res += stack.pop()
91-
return res
77+
v, n = 0, len(s)
78+
sign = '+'
79+
stk = []
80+
for i, c in enumerate(s):
81+
if c.isdigit():
82+
v = v * 10 + int(c)
83+
if i == n - 1 or c in '+-*/':
84+
match sign:
85+
case '+':
86+
stk.append(v)
87+
case '-':
88+
stk.append(-v)
89+
case '*':
90+
stk.append(stk.pop() * v)
91+
case '/':
92+
stk.append(int(stk.pop() / v))
93+
sign = c
94+
v = 0
95+
return sum(stk)
9296
```
9397

9498
### **Java**
@@ -98,39 +102,107 @@ class Solution:
98102
```java
99103
class Solution {
100104
public int calculate(String s) {
101-
int num = 0;
102-
char preSign = '+';
103-
Deque<Integer> stack = new ArrayDeque<>();
104-
for (int i = 0, n = s.length(); i < n; ++i) {
105-
if (Character.isDigit(s.charAt(i))) {
106-
num = num * 10 + (s.charAt(i) - '0');
105+
Deque<Integer> stk = new ArrayDeque<>();
106+
char sign = '+';
107+
int v = 0;
108+
for (int i = 0; i < s.length(); ++i) {
109+
char c = s.charAt(i);
110+
if (Character.isDigit(c)) {
111+
v = v * 10 + (c - '0');
107112
}
108-
if (i == n - 1 || (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ')) {
109-
switch (preSign) {
110-
case '+':
111-
stack.push(num);
112-
break;
113-
case '-':
114-
stack.push(-num);
115-
break;
116-
case '*':
117-
stack.push(stack.pop() * num);
118-
break;
119-
case '/':
120-
stack.push(stack.pop() / num);
121-
break;
113+
if (i == s.length() - 1 || c == '+' || c == '-' || c == '*' || c == '/') {
114+
if (sign == '+') {
115+
stk.push(v);
116+
} else if (sign == '-') {
117+
stk.push(-v);
118+
} else if (sign == '*') {
119+
stk.push(stk.pop() * v);
120+
} else {
121+
stk.push(stk.pop() / v);
122122
}
123-
preSign = s.charAt(i);
124-
num = 0;
123+
sign = c;
124+
v = 0;
125125
}
126126
}
127+
int ans = 0;
128+
while (!stk.isEmpty()) {
129+
ans += stk.pop();
130+
}
131+
return ans;
132+
}
133+
}
134+
```
127135

128-
int res = 0;
129-
while (!stack.isEmpty()) {
130-
res += stack.pop();
136+
### **C++**
137+
138+
```cpp
139+
class Solution {
140+
public:
141+
int calculate(string s) {
142+
int v = 0, n = s.size();
143+
char sign = '+';
144+
stack<int> stk;
145+
for (int i = 0; i < n; ++i) {
146+
char c = s[i];
147+
if (isdigit(c)) v = v * 10 + (c - '0');
148+
if (i == n - 1 || c == '+' || c == '-' || c == '*' || c == '/') {
149+
if (sign == '+') stk.push(v);
150+
else if (sign == '-') stk.push(-v);
151+
else if (sign == '*') {
152+
int t = stk.top();
153+
stk.pop();
154+
stk.push(t * v);
155+
} else {
156+
int t = stk.top();
157+
stk.pop();
158+
stk.push(t / v);
159+
}
160+
sign = c;
161+
v = 0;
162+
}
131163
}
132-
return res;
164+
int ans = 0;
165+
while (!stk.empty()) {
166+
ans += stk.top();
167+
stk.pop();
168+
}
169+
return ans;
133170
}
171+
};
172+
```
173+
174+
### **Go**
175+
176+
```go
177+
func calculate(s string) int {
178+
sign := '+'
179+
stk := []int{}
180+
v := 0
181+
for i, c := range s {
182+
digit := '0' <= c && c <= '9'
183+
if digit {
184+
v = v*10 + int(c-'0')
185+
}
186+
if i == len(s)-1 || !digit && c != ' ' {
187+
switch sign {
188+
case '+':
189+
stk = append(stk, v)
190+
case '-':
191+
stk = append(stk, -v)
192+
case '*':
193+
stk[len(stk)-1] *= v
194+
case '/':
195+
stk[len(stk)-1] /= v
196+
}
197+
sign = c
198+
v = 0
199+
}
200+
}
201+
ans := 0
202+
for _, v := range stk {
203+
ans += v
204+
}
205+
return ans
134206
}
135207
```
136208

solution/0200-0299/0227.Basic Calculator II/README_EN.md

Lines changed: 113 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -43,67 +43,133 @@
4343
```python
4444
class Solution:
4545
def calculate(self, s: str) -> int:
46-
num, n = 0, len(s)
47-
pre_sign = '+'
48-
stack = []
49-
for i in range(n):
50-
if s[i].isdigit():
51-
num = num * 10 + int(s[i])
52-
if i == n - 1 or (not s[i].isdigit() and s[i] != ' '):
53-
if pre_sign == '+':
54-
stack.append(num)
55-
elif pre_sign == '-':
56-
stack.append(-num)
57-
elif pre_sign == '*':
58-
stack.append(stack.pop() * num)
59-
else:
60-
stack.append(int(stack.pop() / num))
61-
pre_sign = s[i]
62-
num = 0
63-
res = 0
64-
while stack:
65-
res += stack.pop()
66-
return res
46+
v, n = 0, len(s)
47+
sign = '+'
48+
stk = []
49+
for i, c in enumerate(s):
50+
if c.isdigit():
51+
v = v * 10 + int(c)
52+
if i == n - 1 or c in '+-*/':
53+
match sign:
54+
case '+':
55+
stk.append(v)
56+
case '-':
57+
stk.append(-v)
58+
case '*':
59+
stk.append(stk.pop() * v)
60+
case '/':
61+
stk.append(int(stk.pop() / v))
62+
sign = c
63+
v = 0
64+
return sum(stk)
6765
```
6866

6967
### **Java**
7068

7169
```java
7270
class Solution {
7371
public int calculate(String s) {
74-
int num = 0;
75-
char preSign = '+';
76-
Deque<Integer> stack = new ArrayDeque<>();
77-
for (int i = 0, n = s.length(); i < n; ++i) {
78-
if (Character.isDigit(s.charAt(i))) {
79-
num = num * 10 + (s.charAt(i) - '0');
72+
Deque<Integer> stk = new ArrayDeque<>();
73+
char sign = '+';
74+
int v = 0;
75+
for (int i = 0; i < s.length(); ++i) {
76+
char c = s.charAt(i);
77+
if (Character.isDigit(c)) {
78+
v = v * 10 + (c - '0');
8079
}
81-
if (i == n - 1 || (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ')) {
82-
switch (preSign) {
83-
case '+':
84-
stack.push(num);
85-
break;
86-
case '-':
87-
stack.push(-num);
88-
break;
89-
case '*':
90-
stack.push(stack.pop() * num);
91-
break;
92-
case '/':
93-
stack.push(stack.pop() / num);
94-
break;
80+
if (i == s.length() - 1 || c == '+' || c == '-' || c == '*' || c == '/') {
81+
if (sign == '+') {
82+
stk.push(v);
83+
} else if (sign == '-') {
84+
stk.push(-v);
85+
} else if (sign == '*') {
86+
stk.push(stk.pop() * v);
87+
} else {
88+
stk.push(stk.pop() / v);
9589
}
96-
preSign = s.charAt(i);
97-
num = 0;
90+
sign = c;
91+
v = 0;
9892
}
9993
}
94+
int ans = 0;
95+
while (!stk.isEmpty()) {
96+
ans += stk.pop();
97+
}
98+
return ans;
99+
}
100+
}
101+
```
102+
103+
### **C++**
100104

101-
int res = 0;
102-
while (!stack.isEmpty()) {
103-
res += stack.pop();
105+
```cpp
106+
class Solution {
107+
public:
108+
int calculate(string s) {
109+
int v = 0, n = s.size();
110+
char sign = '+';
111+
stack<int> stk;
112+
for (int i = 0; i < n; ++i) {
113+
char c = s[i];
114+
if (isdigit(c)) v = v * 10 + (c - '0');
115+
if (i == n - 1 || c == '+' || c == '-' || c == '*' || c == '/') {
116+
if (sign == '+') stk.push(v);
117+
else if (sign == '-') stk.push(-v);
118+
else if (sign == '*') {
119+
int t = stk.top();
120+
stk.pop();
121+
stk.push(t * v);
122+
} else {
123+
int t = stk.top();
124+
stk.pop();
125+
stk.push(t / v);
126+
}
127+
sign = c;
128+
v = 0;
129+
}
130+
}
131+
int ans = 0;
132+
while (!stk.empty()) {
133+
ans += stk.top();
134+
stk.pop();
104135
}
105-
return res;
136+
return ans;
106137
}
138+
};
139+
```
140+
141+
### **Go**
142+
143+
```go
144+
func calculate(s string) int {
145+
sign := '+'
146+
stk := []int{}
147+
v := 0
148+
for i, c := range s {
149+
digit := '0' <= c && c <= '9'
150+
if digit {
151+
v = v*10 + int(c-'0')
152+
}
153+
if i == len(s)-1 || !digit && c != ' ' {
154+
switch sign {
155+
case '+':
156+
stk = append(stk, v)
157+
case '-':
158+
stk = append(stk, -v)
159+
case '*':
160+
stk[len(stk)-1] *= v
161+
case '/':
162+
stk[len(stk)-1] /= v
163+
}
164+
sign = c
165+
v = 0
166+
}
167+
}
168+
ans := 0
169+
for _, v := range stk {
170+
ans += v
171+
}
172+
return ans
107173
}
108174
```
109175

0 commit comments

Comments
 (0)