我有一个由零和一组组成的数组。例如,arr = [0,0,1,1,1]
如何对所有可能的组合进行排序,其中1和0的数量保持不变(根据示例,零的数量为2,1的数量为3)?总共有C(5,3)
或C(5,2)
,其中C = n! / ((n-k)! * k!))
。
我知道如何在数组中获得1和0的所有可能组合,其中有2 ^ n
个部分。有代码:
var color = [];
for(var i = 0; i < n;i++) color[i] = 0;
do{
color[0] += 1;
for(var i = 0; i < n-1;i++){
if(color[i] == 2) color[i] = 0, color[i+1] += 1;
else break;
}
if(color[n-1] == 2) break;
}
while(..);
答案 0 :(得分:0)
计算设置的位有点棘手,但有些算法可以做到。这是我从this answer偷走的一个。
function countSetBits(i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
如果我们知道设置了多少位,我们可以推断其余位未设置。然后我们可以循环遍历适当范围内的所有整数(范围始终从0
开始并上升到2 ^ (total bits) - 1
)以找到正确的数字,其函数如下:
function generateNumbers(set, clear)
{
for ( var n = 0; n < Math.pow(2, set + clear); n++)
{
if (countSetBits(n) == set)
output(n);
}
}
这是一个完整的解决方案:
function countSetBits(i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
function output(i)
{
document.getElementById("Data").innerText += i + "\r\n";
}
function generateNumbers(set, clear)
{
for ( var n = 0; n < Math.pow(2, set + clear); n++)
{
if (countSetBits(n) == set)
output(n);
}
}
generateNumbers(2,3);
输出:
3
5
6
9
10
12
17
18
20
24
以上每个都有2位设置为1
,3位设置为0
。
查看并运行JSFiddle上的代码。