你可以使用递归:
public static void generateBits(String s, int ones, int zeros)
{
if(ones > 0)
generateBits(s + "1", ones - 1, zeros);
if(zeros > 0)
generateBits(s + "0", ones, zeros - 1);
if(ones == 0 && zeros == 0)
System.out.println(s);
}
该函数接受部分完成的字符串和剩余多少个 1 和 0 的计数,然后递归添加 1 和添加 0 的情况(如果还有剩余)。当没有更多可以添加时,它会打印字符串。这将生成每个数字一次,没有重复。如果需要,您可以将字符串解析为数字,而不是将其打印出来。像这样调用:
generateBits("", 3, 2);
我使用String 类型来允许前导零,同时保持简单,但正如@Aivean 在评论中指出的那样,字符串连接可能很昂贵。这是另一种更有效的解决方案,它使用 long,并在打印出值时转换为带有前导零的二进制字符串表示:
public static void generateBits(long val, int ones, int zeros, int len)
{
if(ones > 0)
generateBits((val << 1) + 1L, ones - 1, zeros, len + 1);
if(zeros > 0)
generateBits(val << 1, ones, zeros - 1, len + 1);
if(ones == 0 && zeros == 0)
System.out.println(String.format("%"+len+"s", Long.toBinaryString(val)).replace(' ', '0'));
}
在顶层调用时需要传入0作为长度。你可以这样称呼它:
generateBits(0L, 3, 2, 0);