题解 | #表达式求值#

表达式求值

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]



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 11:47
点赞 评论 收藏
分享
06-18 13:28
已编辑
门头沟学院 Web前端
爱睡觉的冰箱哥:《给予你300的工资》,阴的没边了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务