当前位置: 代码迷 >> java >> 如何使用每种可能的对或错组合生成布尔数组
  详细解决方案

如何使用每种可能的对或错组合生成布尔数组

热度:16   发布时间:2023-07-26 14:22:30.0

我输入了一系列数字,例如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;
        }

    }

您的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;
}
  相关解决方案