一个小编程题-递归方式生成N位格雷码

本文介绍了一种使用递归方法生成N位格雷码的Java实现方式,并提供了完整的代码示例。通过该方法可以有效地生成指定长度的格雷码序列。
今天群友发了一个小编程题,使用递归的方式生成N位格雷码。
首先了解了一下格雷码及其递归思路,但写起来还是调试了很久。
代码如下:

public static String[] createGrayCode(int n){
String[] codes = new String[2 << (n - 1)];
createGrayCode(codes, n);
return codes;
}

private static void createGrayCode(String[] codes, int n){
if(n == 1){
codes[0] = "0";
codes[1] = "1";
}else{
createGrayCode(codes, n - 1);
int len = 2 << (n - 1);
int half = len >> 1;
for(int i = len - 1,j = 0; i >= 0; i--){
if(i < half){
codes[i] = "0" + codes[--j];
}else{
codes[i] = "1" + codes[j++];
}
}
}
}


运行一下:

public static void main(String[] args) {
String[] codes = createGrayCode(3);
System.out.println(Arrays.toString(codes));
}

结果如下:

[000, 001, 011, 010, 110, 111, 101, 100]
通常,人们习惯将所有 n 二进制串按照字典序排列,例如所有 2 二进制串按字典序从小到大排列为:00,01,10,11。 格雷码(Gray Code)是一种特殊的 n 二进制串排列法,它要求相邻的两个二进制串间恰好有一不同,特别地,第一个串与最后一个串也算作相邻。 所有 2 二进制串按格雷码排列的一个例子为:00,01,11,10。 n 格雷码不止一种,下面给出其中一种格雷码生成算法: 1 格雷码由两个 1 二进制串组成,顺序为:0,1。 n+1 格雷码的前 2 n 个二进制串,可以由依此算法生成的 n 格雷码(总共 2 n 个 n 二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。 n+1 格雷码的后 2 n 个二进制串,可以由依此算法生成的 n 格雷码(总共 2 n 个 n 二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。 综上,n+1 格雷码,由 n 格雷码的 2 n 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 2 n+1 个二进制串。另外,对于 n 格雷码中的 2 n 个 二进制串,我们按上述算法得到的排列顺序将它们从 0∼2 n −1 编号。 按该算法,2 格雷码可以这样推出: 已知 1 格雷码为 0,1。 前两个格雷码为 00,01。后两个格雷码为 11,10。合并得到 00,01,11,10,编号依次为 0 ~ 3。 同理,3 格雷码可以这样推出: 已知 2 格雷码为:00,01,11,10。 前四个格雷码为:000,001,011,010。后四个格雷码为:110,111,101,100。合并得到:000,001,011,010,110,111,101,100,编号依次为 0 ~ 7。 现在给出 n,k,请你求出按上述算法生成的 n 格雷码中的 k 号二进制串。 分析这道题的时间复杂度,并且给出分析的过程
最新发布
10-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值