计算给定字符串的等式

时间:2016-10-18 11:26:09

标签: python math equation

给定随机方程(加号和乘法),计算结果。

例如,给定“5 + 3 * 4 * 2 + 1”,返回30。

这是我在编程面试(一年前)时给出的一个问题,并被告知至少在0(n)时间进行。

我试图在python中完成它。

4 个答案:

答案 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)。