【问题标题】:All array combinations with zero in a loop循环中为零的所有数组组合
【发布时间】:2021-12-14 06:25:03
【问题描述】:

给出以下数组

[10, 10, 10, 50, 50, 100, 100, 100, 500, 500, 500, 1000, 1000, 1000, 5000]

我现在想循环输出这些数字与 0 的所有组合。每个数字可以单独出现,也可以与数组中的任何其他数字一起出现(其余的应该是 0)。组合中的数字应保持原来的位置。

原数组的数字应保持不变,只能用零代替。

数组的大小始终保持不变。所以没有额外添加零。所以不可能在原始数组的数字之间插入零以增加数组的长度。

并且由于示例输入有三个 10,例如可以有前 10,然后是 0,然后是 10。

对产生组合的顺序没有要求。

我只是想用下面的例子来阐明我的想法。

[10,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0,  10,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0,  10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0,   0,  0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0,   0, 10, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0,   10, 10, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 10, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 10, 10, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 50, 50, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 10, 10, 50, 50, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 10, 50, 50, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 50, 50, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

在这里进行的最佳方式是什么?

【问题讨论】:

  • 请发布您拥有的代码以及与此相关的具体问题。 SO 不是家庭作业解决服务。
  • @Philipp2706 你能读懂 Python 代码(没有特定结构)吗?
  • “我不认为下面例子中的顺序是正确的。”:为什么不呢?这个升序的要求比较模糊,比如[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]中的非零数以升序出现(只有一个非零)。然而,尚不清楚这是否是可接受的组合。是否要求当包含非零值时,它应该在其原始位置?
  • @Philipp2706 您需要将物品放在相同的位置吗? ([10,10,0,50,...]) 之间没有零?
  • 对组合的产生顺序有要求吗?您是否意识到有超过 60 000 种这样的组合?预计会有这么大的产出吗?

标签: java arrays algorithm loops zero


【解决方案1】:

该任务实际上转化为产生 15 个二进制数字的二进制数,其中 0 表示“产生 0”,1 表示“从该位置的输入复制数字”。

很明显,有 215 种组合,因为这是您可以使用 15 位产生的数字数量。

因此,JavaScript 中的实现可能是:

let input = [10, 10, 10, 50, 50, 100, 100, 100, 500, 500, 500, 1000, 1000, 1000, 5000];

let quit = 20; // For demo purpose, let's stop after 20 outputs...
let count = Math.pow(2, 15); // Total number of combinations
for (let i = 0; i < count; i++) { // For each combination
    let combi = []; // Create new empty array
    for (let bit = 0, bits = i; bit < 15; bit++, bits >>= 1) {
        // Depending on bit, either append 0 or the input to the array
        combi.push(bits & 1 ? input[bit] : 0); 
    }
    console.log(...combi); // Output all values in the array
    if (quit-- < 0) break; // For this demo only
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-01-14
    相关资源
    最近更新 更多