题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
class Solution:
def solve(self , s1: str) -> int:
def epr(s, i):
cur, i = fac(s, i) # epr = fac { +- fac }
data, k = cur, i
cur, i = get(s, i)
while type(cur) is str and cur in '+-':
cur_next, i = fac(s, i)
if cur == '+': data += cur_next
if cur == '-': data -= cur_next
cur, i = get(s, i)
k = i - 1
return data, k
def fac(s, i): # fac = itm { * / itm}
cur, i = itm(s, i)
data, k = cur, i
cur, i = get(s, i)
while type(cur) is str and cur == '*':
cur_next, i = itm(s, i)
if cur == '*': data *= cur_next
if cur == '/': data /= cur_next
cur, i = get(s, i)
k = i - 1
return data, k
def itm(s, i): # itm = digits | (epr)
cur, i = get(s, i)
if cur == '(':
cur, i = epr(s, i)
_, i = get(s, i) # ')'
return cur, i
def get(s, i):
if i >= len(s): return None, i
if s[i] in '()*+-': return s[i], i + 1 # match characters
k = i
while k < len(s) and s[k].isdigit(): k += 1 # match digits, return next index
return int(s[i:k]), k
return epr(s1, 0)[0]
OPPO公司福利 1202人发布