java生成从1到2^k1的数字的二进制表示形式
我想获得一个范围为1的二进制整数列表。。。2^k-1。否则,我需要一个k位的所有可能组合的列表。例如,假设k是3,我需要:
001
010
011
100
101
110
111
当我计划在Java中这样做时,我考虑使用一个位集来表示每个数字,并在列表中存储一个值,但我认为这个问题可能与语言无关。基本上,我需要找出生成整个集合的算法
我想我需要一个递归的解决方案,考虑到之前设置的位
void fill(int k, int i, boolean wasSet) {
if (i==k) return;
BitSet bs = new BitSet();
for (int j=0; j<k; j++) {
if (!wasSet) {
bs.set(i);
fill(k, i, true);
} else {
fill(k, j, false);
}
}
注意:这个函数原型显然是非常错误的
注2:我真的希望避免使用字符串,因为我以后需要使用这个值来执行其他一些计算,而位集在这方面非常方便
# 1 楼答案
您可以拥有以下内容:
其中
n
是您想要的最大数字更新
要使用
BitSet
,java7有一个BitSet.valueOf(byte[])和BitSet.toByteArray()
有关更多详细信息,请参阅this post
# 2 楼答案
那么,您可以始终手动递增:
这将把LSB(最低有效位)放在地址0处,但由于它包含所有组合,这不重要,只有当您将其表示为MSB(most-| |-)将在索引0处时,才会对其进行排序
# 3 楼答案
# 4 楼答案
下面是我提出的递归解决方案
它只是针对每个位置尝试设置该位,然后递归
它对所有置换使用相同的
BitSet
。如果您希望每个都有一个,您可能需要复制它# 5 楼答案
这里有一个简单的解决方案,它相当于遍历一个完整的二叉树并记录每条路径
# 6 楼答案
奇怪的问题,一些先进的概念,但还有一些逻辑空白
尽管如此,如果您想要为每个值设置位集,请执行相同的操作(如tokhi建议的):
编辑
在一些关于递归或循环是否更好的“聊天”之后,我已经完成了这个测试
我对上面的代码进行了修改,使其效率稍高一些,但是,我对Dukeling的代码进行了较大的修改,使其返回所有位集,而不是只修改一个位集而不存储结果
请注意,递归代码中存在一个“bug”,因为它返回不应该是结果的一部分的no bits set值
无论如何,这只是一个值得思考的问题
以下是我的测试代码:
这是我机器上的输出: