一旦您计算出方程a * x + b = 0 中的系数a 和b,求解线性方程对您来说(我希望)非常容易。
因此,问题的难点在于解析表达式并“评估”它以找到系数。您的示例表达式非常简单,它仅使用运算符一元-、二元-、二元+。还有=,你可以专门处理。
从问题中不清楚解决方案是否还应处理涉及二进制* 和/ 或括号的表达式。我想知道面试问题是否有意:
- 让您编写一些简单的代码,或者
- 在你写任何东西之前让你问问题的真正范围是什么。
两者都是重要的技能:-)
这个问题甚至可能是有意的:
- 将那些有很多编写解析器经验的人(他们会以他们能写/打字的速度解决它)与那些没有编写解析器的人(他们可能在几分钟内很难解决它,至少没有一些提示)分开.
无论如何,为了满足未来更复杂的要求,解析算术表达式有两种常用方法:递归下降法或 Dijkstra 的调车场算法。您可以查看这些,如果您只需要 1.0 版中的简单表达式,那么您可以使用 Dijkstra 算法的简化形式。然后,一旦解析了表达式,就需要对其求值:使用 x 中的线性表达式值并将 = 解释为具有最低可能优先级的运算符,即“减法”。结果是x 中的线性表达式,等于0。
如果您不需要复杂的表达式,那么您可以直接从左到右评估这个简单的示例,一旦您对其进行标记[*]:
x
x + 9
// set the "we've found minus sign" bit to negate the first thing that follows
x + 7 // and clear the negative bit
x + 3
2 * x + 3
// set the "we've found the equals sign" bit to negate everything that follows
3 * x + 3
3 * x - 2
3 * x - 1
3 * x - 4
4 * x - 4
最后,将a * x + b = 0解为x = - b/a。
[*] 示例标记化代码,在 Python 中:
acc = None
for idx, ch in enumerate(input):
if ch in '1234567890':
if acc is None: acc = 0
acc = 10 * acc + int(ch)
continue
if acc != None:
yield acc
acc = None
if ch in '+-=x':
yield ch
elif ch == ' ':
pass
else:
raise ValueError('illegal character "%s" at %d' % (ch, idx))
替代示例标记化代码,也在 Python 中,假设标记之间总是有空格,如示例中所示。这将令牌验证留给解析器:
return input.split()