我输入了一系列数字,例如1 2 3 4,我可以将它们彼此加或减,然后指定它必须等于4。我使用布尔数组表示这两个操作:True ='+'和False ='-'。我在while循环中使用了一种方法调用,该方法调用将在布尔数组中生成true或false的每种可能组合。我的代码会生成组合来解决数字序列,但是当数字序列为15或更大时,该方法将花费很长时间,并且无法解决数字序列。
有人对我如何提高效率和解决20多个整数问题提出建议吗?
private static boolean hasNextOper(boolean[] oper) {
for (int i = 0; i < oper.length; i++) {
if (oper[i]) {
oper[i] = false;
} else {
oper[i] = true;
return true;
}
}
return false;
}
此方法也被这样调用:
while (hasNextOper(oper)) {
if (isTarget(oper, numbers, target, order)) {
displayResults(oper, numbers, target, order);
return;
}
}
答案 0 :(得分:0)
您的hasNextOper
方法似乎正在遍历这些数组值:
{false, false, true }
{false, true , false}
{false, true , true }
{true , false, false}
...
请注意,它们如何以与二进制数相同的模式变化:000、001、010,...。因此,您应该可以使用整数(long
类型最多可以有64位;如果您想要更多,请使用BigInteger
,但这有点复杂)。
// Example: generate all possible combinations in an array of 20 booleans.
final int length = 20;
for (long n = 0; n < (1 << length); n++) {
oper = longBitsToBoolArray(n, length);
// ... now do things with oper
// ...
}
static bool[] longBitsToBoolArray(long bits, int length) {
bool[] oper = new bool[length];
for (int i = 0; i < length; i++)
oper[i] = ((bits >>> i) & 1) != 0;
}