题目描述
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1
返回:["0","1"]
格雷码(Gray Code): 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code), 另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。 生成方法: 2位格雷码 00 01 11 10 || 10 11 01 00 3为格雷码 000 001 011 010 || 110 111 101 100 3位格雷码在2位格雷码的基础上生成 算法思想: 1.递归,n为gray码是由n-1位gray码生成,长度使n-1位格雷码的2倍 2.n=3的格雷码就是对n=2的格雷码首位分别添加0或者1生成 3.添加0后,生成正确顺序的格雷码 4.添加1后,生成的顺序需要反向 5.将添加0后生成的格雷码和添加1后生成的格雷码组合
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
String[] result = getGray(n);
int length = result.length;
for(int i = 0 ; i < length ; i++){
System.out.print(result[i] + " ");
}
System.out.println();
}
scan.close();
}
private static String[] getGray(int n) {
if(n == 1){
String[] res = {"0" , "1"};
return res;
}else{
//n位格雷码是n-1位格雷码长度的2倍
String[] previous_res = getGray(n-1);
int previous_length = previous_res.length;
String[] res = new String[previous_length * 2];
//首位添加0,顺序不变
for(int i = 0 ; i < previous_length ; i++){
res[i] = "0" + previous_res[i];
}
//首位添加1,需要逆序
for(int j = 0 ; j < previous_length ; j++){
res[previous_length + j] = "1" + previous_res[previous_length - 1 - j];
}
return res;
}
}
}
2132

被折叠的 条评论
为什么被折叠?



