本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为中等题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.输出即可