牛客网学习笔记(HJ50 四则运算)

285 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为中等题HJ50 四则运算

HJ50 四则运算

描述

输入一个表达式(用字符串表示),求这个表达式的值。

保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

数据范围:表达式计算结果和过程中满足 ∣val∣≤1000  ,字符串长度满足 1≤n≤1000

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

示例1

输入:

3+2*{1+2*[-4/(8-6)+7]}

输出:

25

代码

while True:
    try:
        s = input()
        s = s.replace('{', '(')
        s = s.replace('}', ')')
        s = s.replace('[', '(')
        s = s.replace(']', ')')
        print(int(eval(s)))
    except:
        break

解析

我本来一直执着于自己想怎么写,也就是像之前一样不用函数(因为我是不了解常用函数的纯纯小白),用那种虽然很笨拙但是很好想到的方法,但是想了好久都没写出来。我的困难是,我可以做到把字符串拆开然后把数字和符号分开保存,但是一直没想到怎么按照运算顺序进行计算。如果是按照符号的出现顺序从左到右进行计算,那还可以用if语句这种笨方法写,但是按照四则运算顺序还要考虑括号具有优先级就很难搞了。

看了别人的写法,显得我智商很捉急了。使用函数来写的话只需要把{}和[]都换成(),然后直接用eval()函数进行处理就可以了。看起来好简单啊,但是需要对函数有很深的了解,对常用函数很了解才可以。
具体过程:
1.读入字符串
2.用replace进行括号的替换(这个函数我之前也没用过)
3.直接用eval(式子)就是按照四则运算处理好的结果
4.输出即可