给定随机方程(加号和乘法),计算结果。
例如,给定“5 + 3 * 4 * 2 + 1”,返回30。
这是我在编程面试(一年前)时给出的一个问题,并被告知至少在0(n)时间进行。
我试图在python中完成它。
答案 0 :(得分:2)
内置函数eval()
不推荐 作为首选,但在这种特殊情况下非常有用:
string = "5 + 3 * 4 * 2 + 1"
print (eval(string))
# 30
尽管使用eval()
存在相当多的副作用和风险。所以不要经常使用。
一种非常有用的方法是分别提取运算符和操作数,然后进行所需的算术运算。
operands = [int(x) for x in string if x.isdigit()] # not using re as this is faster
# [5, 3, 4, 2, 1]
operators = re.findall(r"[^\d\s]", string)
# ['+', '*', '*', '+']
现在您可以将运算符应用于函数中的两个相应操作数。 确保保持正确的算术惯例 (*
之前应该+
)
答案 1 :(得分:2)
假设您不想使用eval,可以尝试内联执行此操作。
对于这类问题,一个很好的解决问题的方法是写出你想要发生的事情。如果您逐项查看此项目,您会注意到我们添加后,您可以安全地将所有以前的结果一起添加。通过乘法我们总是要等待下一个项目。
def strToCal(strings):
first = 0;
second = 0;
list1 = []
list1 = strings.split()
mult = False
for i in list1:
if i == "+":
first += second
second = 0
mult = False
elif i == "*":
mult = True
else:
if mult:
second *= int(i)
else:
second = int(i)
return (first + second)
print strToCal("5 * 34 * 75 * 2 + 1")
答案 2 :(得分:0)
您可以用
形式编写表达式 expression = term + term + ... + term
和术语
term = value * value * ... * value
这是为表达式指定语法的非正式方式。您应该认识到,对此表单的表达式的评估不需要递归下降解析器,这会极大地简化事情。
然后,O(N)解决方案技术从左到右评估每个term
;在评估特定term
的每个步骤上调用一个函数。
答案 3 :(得分:0)
另一种解决方案是将您的(中缀)数学表达式转换为postfix,这很容易使用堆栈进行评估。如果您对此感兴趣,那么这是一个很好的网站,描述转换以及后缀表达式的评估/计算:
http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html
将中缀转换为后缀并计算表达式的计算复杂度约为O(3 * n),实际上仍为O(n)。