问题描述
我输入了一系列数字,例如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;
}
}
1楼
您的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;
}