题目描述
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(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; } } }