我们在测试中被问到以下问题,但我不确定该如何处理:
给出一组数字和一组运算符,找到产生该数字的最小操作数。
例如:
输入
set of digits: {8, 1, 6, 2, 7}
set of operations: {*, /, -}
number to be generated: 981
输出
number of operations: 2
Explanation: 981 = 16 * 62 - 11 [ 2 operations: * and - ]
约束:
all numbers to be used as integers
0 <= each number in set of digits <= 9
possible set of operations: { +, -, *, / } [ the division operation will always return an integer ]
0 <= number to be generated <= 999
it is necessary that while performing the operations, any of the calculated values must not exceed 999 or be negative
the precedence of operations will always be from left to right, BODMAS/PEMDAS won't be followed. For example: 16*6+2*11 will be calculated as: ((16*6) + 2) * 11
在解决方法方面的任何帮助将不胜感激。
我认为可以通过生成最接近给定数字的数字来解决该问题,然后可以将差异视为要生成的新数字问题。尽管我认为这不会产生形成给定数字所需的最少操作数。
由于我不确定如何解决该问题,因此无法编写太多代码。
预先感谢!
答案 0 :(得分:2)
我们可以将此问题视为图形问题,并使用BFS加以解决。
首先,我们尝试在不使用任何运算符的情况下从set of numbers
创建所有可能的数字,请将此基本集称为。通过将每个数字分解为数字并检查所有这些数字是否属于set of numbers
即可轻松实现。
for (int i = 0; i < 1000; i++){
if i can be formed by set of numbers {
add i to base set;
}
}
现在,从基本集中的每个数字作为起始顶点开始,我们通过对基本集中应用不同的运算符来遍历下一个顶点
Queue q = base set
int[] distance = new int[1000];
while q is not empty{
int number = q.pop();
for(int i : base set){
for(operator : set of operators) {
int next = number operator i
if next < 1000 && next >= 0 && next not visited {
mark next as visited;
distance[next] = 1 + distance[number];
q.add(next);
}
}
}
}
return distance[target];
每个顶点将被访问一次,因此时间复杂度将为O(n ^ 2 * m)
,其中n
是最大顶点数量(在这种情况下为1000),而m
是运算符的数量