任务
给出一个数字列表
如:
1, 2, 3.
使用乘法或加法运算(/+)得到这些数字的每个组合
所以在上面的例子中,组合是
1+2+3
1+23
123
1*2+3
我写了一个基本的递归方法来解决这个问题,我的想法如下
给我一个号码我可以
加上下一个号码
乘以下一个数字
所以你得到了一棵这样的树
START NUMBER
/ \
* +
/ \ / \
* + * +
等。。。
但是每个答案输出两次
使用1,2,3得到的输出是
12+3
12+3
123
123
1+2+3
1+2+3
1+23
1+23
我的问题
这是一个可接受的算法吗?如果是的话,我的代码出了什么问题
有没有其他更有效的方法。
代码
package AG;
import java.util.LinkedList;
import java.util.Stack;
/**
*
* @author Tamir Shklaz
*/
public class ArithmeticGame {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
LinkedList<Integer> number = new LinkedList<>();
for (int i = 1; i <= 3; i++) {
numbers.add(i);
}
permutateSigns('*', numbers, 0, "");
permutateSigns('+', numbers, 0, "");
}
public static void permutateSigns(char operation, LinkedList<Integer> number, int pos, String expresion) {
double sum = 0;
if (pos == number.size()-1) {
expresion += number.get(pos);
System.out.println(expresion);
} else {
expresion += (Integer.toString(number.get(pos)) + Character.toString(operation));
permutateSigns('+', number, pos + 1, expresion);
permutateSigns('*', number, pos + 1, expresion);
}
}
}
6条答案
按热度按时间3pvhb19x1#
我认为你的错误是你给函数permutatesigns传递了一个操作符,而不是给所有操作符。
因此,在一开始调用同一个函数两次,结果得到两倍的答案。
这是正确的代码(我想这是你需要的)
另外,我建议您使用arraylist而不是linkedlist,因为执行的get操作将有o(1)个时间而不是o(n)
umuewwlo2#
您的错误是,在上一次调用permutatesigns()函数两次时增加position,因此ˋpos==number.get(pos)ˋ 对每个组合都是两次。一次下面的符号是+第二次是*。一个非常快速的解决方法是只输出一个解决方案,例如,如果操作char是'+'
对于更优雅的解决方案,您可能需要重新安排操作/更改算法流。
在这里,我改变了算法,先放一个运算符,然后放一个数字
vdzxcuhz3#
有一个更好的解决办法。你的代码是递归的,因此会有一个可怕的运行时。有一个简单得多的解决方案:如果你有
n
操作员和m
要添加的数字,总共有n ^ (m - 1)
可能的组合。通过将每个运算符编码为一个数字,可以创建一个基于n的数字。或者反过来说:每个数字(0 , n ^ (m - 1)
可以解析为运算符的组合。注意:此代码也可以使用更多运算符或更多数字运行
6tdlim6h4#
显然我回答得有点晚了。问题是你没有迭代操作数。下面是解决问题的清晰代码。
s71maibg5#
你可以这样看待这个问题。基本上你只需要生成你需要使用的操作符的置换。在这个例子中,它们是+和*所以,它们的置换是:++****那么你只需要把它们插入到我在图中给你展示的操作符位置。留给你编码的部分。
:)
aydmsdu96#
javascript赋给集合,第一个为操作数,应应用于第二组数字,然后我们用目标值计算生成的表达式。