题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

算法:栈
1.用栈保存各部分计算的和
2.遍历表达式,使用 sign 变量记录运算符,初始化是 '+';使用 number 变量记录字符串中的数字部分的数字值是多少
2.0 遇到空格时跳过
2.1 遇到数字时继续遍历求这个完整的数字的值,保存到 number 中
2.2 遇到左括号时递归求这个括号里面的表达式的值
先遍历找到对应的右括号,因为可能里面还嵌有多对括号,使用一个变量 counterPartition 统计括号对数直到变量为 0
2.3 遇到运算符时或者到表达式末尾时,就去计算上一个运算符并把计算结果 push 进栈,然后保存新的运算符到 sign
如果是 + ,不要计算,push 进去
如果是 - ,push 进去负的当前数
如果是 ×、÷ ,pop 出一个运算数和当前数作计算
3.最后把栈中的结果求和即可

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
#

def removeSpace(arr,i,n):
    # remove extra space
    while i<n:
        if arr[i].isspace(): 
            i+=1
        else:
            break
    return i
def getNum(arr,i,n):
    i = removeSpace(arr, i, n)
    if arr[i].isnumeric():
        # get a number 
        tnum = []
        while i<n:
            # is numberic
            if arr[i].isnumeric(): 
                tnum.append(arr[i])
                i+=1
            else:
                break
        tnum = int(''.join(tnum))
        return int(tnum),i
    elif arr[i]=="(":
        start = i
        brackNum = 1
        j = i+1
        while j<n:
            if arr[j]==")": brackNum -= 1
            elif arr[j]=="(": brackNum += 1
            j+=1
            if brackNum==0:
                break
        return cal(arr[i+1:j-1]), j
def getSign(arr,i,n):
    i = removeSpace(arr, i, n)
    if arr[i] == '-':
        # 减号
        return "-",i+1
    elif arr[i] == '+':
        # 加号
        return "+",i+1
    elif arr[i] == '*':
        # 乘号
        return "*",i+1
    elif arr[i].isnumeric():
        return "+",i
    elif arr[i] == '(':
        return "+",i
    else:
        return None
def cal(arr):
    res = 0
    stack = []
    i = 0 
    n = len(arr)
    while i<n:
        # read signs
        sign , i = getSign(arr, i, n)
        num , i = getNum(arr, i, n)
        if sign == '-':
            # 减号
            stack.append(-num)
        elif sign == '+':
            # 加号
            stack.append(num)
        elif sign == '*':
            # 乘号
            stack.append(stack.pop()*num)
        else:
            print("Error expression!")

    res = sum(stack)
    return res

class Solution:
    def solve(self , s ):
        # write code here
        return cal(s)
全部评论

相关推荐

05-12 10:10
已编辑
门头沟学院 人工智能
写这篇之前我犹豫了挺久。一方面是怕被人骂,&quot;又一个收割焦虑的转行帖&quot;;另一方面是看了太多用&nbsp;GPT&nbsp;套娃出来的「学习路线」文章,AI&nbsp;味重得让人没法读完。所以这篇全是亲身踩过的坑,时间线、用过的项目、当时的心路全都尽量原样写出来。如果你是大学生在迷茫要不要转&nbsp;AI,或者已经在转的路上,希望能给点参考。&nbsp;一个反共识的开场:你以为进&nbsp;OpenAI&nbsp;的人都是博士?&nbsp;先讲个故事,跟我没关系,但跟所有想转&nbsp;AI&nbsp;的人都有关系。&nbsp;OpenAI&nbsp;的&nbsp;Sora&nbsp;团队(就是搞文生视频那个)一共&nbsp;13&nbsp;个人。这里面有两个人特别有意思:&nbsp;Will&nbsp;DePue,密歇根大学计算机系,直接辍学了。17...
_hengheng:我也本,也算是做ai相关,我最开始感觉做ai工程师有多么多么困难,后来发现懂了原理后整体训练完全可以看成一个流程化的内容,开源方案太多了,大多基本都是按着模子在自家业务上做各种操作,就算是大厂的小部门也没那么多资源去训基模,反而更多的是像怎么把技术往业务方向靠近了,不过当前时代如果本科学历没那么好加上自己执行力不是特别强还真不建议走ai工程师这条路,可以试试其他ai的偏业务方向,不然校招不太好杀出来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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