-
Notifications
You must be signed in to change notification settings - Fork 17
/
basic-calculator-ii.py
62 lines (52 loc) · 1.84 KB
/
basic-calculator-ii.py
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
import string
from enum import Enum
class Solution:
def calculate(self, s: str) -> int:
result = 0
class Operation(Enum):
ADD = 1
SUBSTRACT = 2
MULTIPLY = 3
DIVIDE = 4
def get_operation(pos, s):
if s[pos] == "+":
return pos + 1, Operation.ADD
elif s[pos] == "-":
return pos + 1, Operation.SUBSTRACT
elif s[pos] == "*":
return pos + 1, Operation.MULTIPLY
elif s[pos] == "/":
return pos + 1, Operation.DIVIDE
elif s[pos] in string.digits:
return pos, Operation.ADD
else:
raise NotImplementedError(f"Operation {s[pos]} is not implemented")
def get_number(pos, s):
number = 0
while pos < len(s) and s[pos] in string.digits:
number = number * 10 + int(s[pos])
pos += 1
return pos, number
s = s.replace(" ", "")
pos = 0
prev = 0
while pos < len(s):
pos, operation = get_operation(pos, s) # true + , false -
pos, number = get_number(pos, s)
if operation == Operation.ADD:
result += number
prev = number
elif operation == Operation.SUBSTRACT:
result -= number
prev = -number
elif operation == Operation.MULTIPLY:
result -= prev
result += prev * number
prev = prev * number
elif operation == Operation.DIVIDE:
if number == 0:
raise ZeroDivisionError("Cannot divide by zero")
result -= prev
result += int(prev / number)
prev = int(prev / number)
return result