获取大小为n的所有二进制组合,但只有k 1s

时间:2017-04-11 20:38:12

标签: java binary

所以我试图生成大小为n的所有二进制文件,但条件是只有k 1s。即

对于大小n = 4,k = 2,(超过4种组合有2种)

1100
1010
1001
0110
0101
0011

我陷入困境,无法弄清楚如何生成这个。

5 个答案:

答案 0 :(得分:0)

一种方法是从k数字0 .. n的集合中生成n-1值的所有组合,并使用这些值来设置输出中的相应位。 / p>

This Q&A说明了如何生成kn元素的所有组合。有了这些组合,请使用1 << v[c][i]的按位OR来生成最终结果,其中v[c][i]表示i - 来自组合编号c的数字。

答案 1 :(得分:0)

使用基本递归方法打印所有剩余的二进制序列是为了强制执行约束:

    private static void binSeq(int n, int k, String seq) {
    if (n == 0) {
        System.out.println(seq);
        return;
    }

    if (n > k) {
        binSeq(n - 1, k, seq + "0");
    }

    if (k > 0) {
        binSeq(n - 1, k - 1, seq + "1");
    }
}

答案 2 :(得分:0)

这是我对此算法的非递归处理。因为二进制字符串有toString个排列,我们可以使用for循环遍历每个可能的字符串并检查“1”的数量是否不等于2^n

k

答案 3 :(得分:0)

以下是在Java中使用递归作为方法的解决方案

public class NumberOfBinaryPatternsSpecificOnes {

    static int[] bitArray = new int[]{0,1}; // kept binary bits in array

    public static void main(String args[])
    {   
        System.out.println("Below are the patterns\n");
        int n = 4;
        int k = 2;
        drawBinaryPattern(n,"",k,0);
    }
    private static void drawBinaryPattern(int n,String seed,int numberOfOnes,int currentCount)
    {
        if(n==0)
        {
            if(currentCount==numberOfOnes){
                System.out.println(seed);
            }
            return;
        }   
        for(int j=0;j<bitArray.length;j++)
        {
            String temp = seed+bitArray[j];
            int currentcountTemp = bitArray[j]==1?(currentCount+1):(currentCount);

            if(currentcountTemp>numberOfOnes)
            {
                return;
            }
            drawBinaryPattern(n-1,temp,numberOfOnes,currentcountTemp);
        }
    }
}

答案 4 :(得分:-1)

int n = 4,k = 2;

    for (int i = 0; i < Math.pow(2,n) ; i++) {
        int a = Integer.bitCount(i);
        if (a == k) System.out.println(Integer.toBinaryString(i));
    }

我认为这是最简单的答案。