生成一个计算给定N的有效表达式

时间:2014-01-27 16:24:03

标签: algorithm language-agnostic tree expression

这是在接受采访时向我询问的,

Given a list of integer numbers, a list of symbols [+,-,*,/] and a target number N,  
provide an expression which evaluates to N or return False if that is not possible. 
e.g. let the list of numbers be [1,5,5] and the target number is 9, one possible 
solution could be 5+5-1.

现在,我的解决方案是一个强制递归解决方案,它贯穿所有可能的数字和所有可能的操作,并且当数字超过N或等于N时递归终止。

这让我想知道是否有更好,更精致的解决方案。有什么想法吗?我正在考虑某种表达树的反向构造。

1 个答案:

答案 0 :(得分:4)

我要继续说这个面试问题不仅仅是试图通过提问来缩小问题范围。

有一个非常大的问题清单,你没有涉及这个问题对解决方案很重要
  1. 当你将它们分开时,数字是否保持整数,所以是1/5浮点数,0或大小数
  2. 如果输入中只有一个数字和运算符可以重复,如果是这样,如果找不到解决方案似乎无法终止
  3. 您可以使用括号或输入是否有括号
  4. 数字可以为负数
  5. 你可以打印真假,还是必须找到有效的解决方案
  6. 我注意到的一个问题是,如果除法通过舍入工作,并且您在运算符列表中有+/,则可以始终除以直到它舍入为1然后只添加。此外,如果您可以重复乘法基本上是无关紧要的,因为它可以被许多添加替换。

    我确信你的面试官希望你提出更多澄清问题的原因是因为即便是我想到的一小部分问题也会在很大程度上改变这个问题。

    最后要考虑的是,这个问题是背包问题的超集,已经知道是np-complete,所以显然没有多项式时间解决方案。