我一直像疯子一样在谷歌上搜索,但找不到任何足以让我开始的具体内容。请原谅我完全的菜鸟和可能恶魔般的略读能力。
基本上,我有一份包含 9 个问题的问卷,每个问题都有 2 个可能的答案。做完数学 (2^9) 后,我知道有 512 个排列。
我希望生成所有排列的列表,没有任何重复,为我提供可能的答案组合列表。
我希望我的输出看起来与此类似:
112112111
其中 1s 表示该人为某个问题选择了答案“a”,而 2s 表示该人选择了答案“b”。
任何帮助将不胜感激,谢谢。
我一直像疯子一样在谷歌上搜索,但找不到任何足以让我开始的具体内容。请原谅我完全的菜鸟和可能恶魔般的略读能力。
基本上,我有一份包含 9 个问题的问卷,每个问题都有 2 个可能的答案。做完数学 (2^9) 后,我知道有 512 个排列。
我希望生成所有排列的列表,没有任何重复,为我提供可能的答案组合列表。
我希望我的输出看起来与此类似:
112112111
其中 1s 表示该人为某个问题选择了答案“a”,而 2s 表示该人选择了答案“b”。
任何帮助将不胜感激,谢谢。
您只是在枚举 0 到 512 之间的数字,并且您希望以二进制表示形式打印字符串,其中 0 和 1 替换为 1 和 2,并适当填充,因此以下代码将起作用:
for (int i = 0; i < 512; i++) {
System.out.println(String.format("%9s", Integer.toBinaryString(i)).replace('1', '2').replace('0', '1').replace(' ', '1'));
}
请参阅此相关问题以在 Java 中生成填充的二进制字符串:How to get 0-padded binary representation of an integer in java?
一种可能的方法是查找 111111111 和 222222222 之间仅包含 1 和 2 的所有数字。
就像是:
for (i=111111111 ; i<=222222222 ; i++)
if (number_has_only_one_or_twos(i))
print i
如果我正确阅读了您的问题,那么您只需要 0 到 511 之间数字的二进制表示(因为 511 - 0 + 1 = 512)。您需要做的就是找到该范围内每个数字的 9 位二进制表示。取 0 表示答案 B,取 1 表示答案 A。
您可以轻松地将二进制数转换为字符串并将 0 替换为 2 并打印出来。这就是数字二进制表示的美妙之处。这是查找给定范围内所有排列的最佳方法之一。
想象一下找到数组中所有元素的排列。将数字范围从零到数组的大小,取 1 表示您要使用该索引,取 0 表示不使用该索引。每当您遇到它时,它将大大简化该问题。