问题1:给定一个正整数 n,列举出所有的位数为 n 的二进制数
这里采用递归列举所有的数。
public class Satchel {
// 自定义打印函数
public static void printf(int[] arr) {
int len = arr.length;
int i = 0;
for (; i < len-1; i++) {
System.out.print(arr[i]);
}
System.out.println(arr[i]);
}
public static void binary(int[] arr, int len, int n) {
if (n == len - 1) {
printf(arr);
arr[n] = 1;
printf(arr);
return ;
}
binary(arr, len, n+1);
arr[n] = 1;
binary(arr, len, n+1);
}
}
问题2:给上述问题加一个约束,每次打印的数之间的汉明距离为1
n = 2 n = 3 n = 4
00 000 0000
01 001 0001
11 011 0011
10 010 0010
110 0110
111 0111
101 0101
100 0100
中心思想:绑定两个相邻的位为一组,判断是从 00 -> 01 -> 11 -> 10 还是 10 -> 11 -> 01 -> 00的顺序。如果 n 是偶数,当然很简单,如果是奇数,则分别令最高位为0/1,剩下的 n-1 位是偶数位。
public static void binaryPlus(int n) {
int[] arr = new int[n];
if (n % 2 == 0) { // 判断奇数或偶数
binaryPro(arr, n, 0, 1);
} else {
binaryPro(arr, n, 1, 2);
arr[0] = 1;
binaryPro(arr, n, 1, 2);
}
}
public static void binaryPro (int[] arr, int n, int left, int right) {
if (left == n) {
printf(arr);
return ;
}
if (arr[left] == 0 && arr[right] == 0) {
binaryPro(arr, n, left+2, right+2);
arr[right] = 1;
binaryPro(arr, n, left+2, right+2);
arr[left] = 1;
binaryPro(arr, n, left+2, right+2);
arr[right] = 0;
binaryPro(arr, n, left+2, right+2);
} else if (arr[left] == 1 && arr[right] == 0) {
binaryPro(arr, n, left+2, right+2);
arr[right] = 1;
binaryPro(arr, n, left+2, right+2);
arr[left] = 0;
binaryPro(arr, n, left+2, right+2);
arr[right] = 0;
binaryPro(arr, n, left+2, right+2);
}
}