【发布时间】:2020-12-05 16:53:27
【问题描述】:
给定 n,我有一个二进制模式要在我的应用程序的一部分中生成,如下所示:
n = 0
0 -> 0
n = 1
0 -> 0
1 -> 1
n = 2
0 -> 00
1 -> 01
2 -> 10
3 -> 11
n = 3
0 -> 000
1 -> 001
2 -> 010
3 -> 100
4 -> 011
5 -> 101
6 -> 110
7 -> 111
n = 4
0 -> 0000
1 -> 0001
2 -> 0010
3 -> 0100
4 -> 1000
5 -> 0011
6 -> 0101
7 -> 1001
8 -> 0110
9 -> 1010
10 -> 1100
11 -> 0111
12 -> 1011
13 -> 1101
14 -> 1110
15 -> 1111
n = 5
0 -> 00000
1 -> 00001
2 -> 00010
3 -> 00100
4 -> 01000
5 -> 10000
6 -> 00011
7 -> 00101
8 -> 01001
9 -> 10001
10 -> 00110
11 -> 01010
12 -> 10010
13 -> 01100
14 -> 10100
15 -> 11000
16 -> 00111
17 -> 01011
18 -> 10011
19 -> 01101
20 -> 10101
21 -> 11001
22 -> 01110
23 -> 10110
24 -> 11010
25 -> 11100
26 -> 01111
27 -> 10111
28 -> 11011
29 -> 11101
30 -> 11110
31 -> 11111
我会尽力解释这个算法:
算法有循环。在每个循环中,都会翻转一个额外的位。然后组合出来。
所以在第一个循环中,没有位是 1。
在第二个循环中,只有一位是 1。我们需要首先遍历所有可能的组合,这样的顺序是只有在最右边位的所有组合都结束后,最左边的位才会点亮。
类似地继续进行进一步的循环。
我不确定如何为它编写高效的代码。我能想到的一件事就是这个问题的 DP 解决方案。但是有没有更优雅的,比如数学解决方案,我可以在其中输入“n”并获得等效的二进制模式?
【问题讨论】:
-
你可以使用the famous algorithm of listing integers with the same Hamming weight,并为每一个可能的体重这样做
-
关于“我们需要首先检查所有可能的组合,按照这样的顺序,只有在最右边位的所有组合都结束后,最左边的位才会点亮”:这不是您的示例所显示的;对于 n=4,它具有“7 -> 1001”,后跟“8 -> 0110”。哪个是正确的?
-
请澄清有关订单的陈述与示例之间的差异。其中一个是错误的。