题目描述
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1
返回:["0","1"]
代码如下:
4 package com.yzh.xuexi; 5 6 import java.util.ArrayList; 7 import java.util.List; 8 import java.util.Scanner; 9 10 public class GeLeiMa { 11 12 public static void main(String[] args) { 13 Scanner scanner =new Scanner(System.in); 14 while (scanner.hasNext()) { 15 int n=Integer.valueOf(scanner.nextLine()); 16 List<String>list1=new ArrayList<>((int)Math.pow(2, n)); 17 List<String>list2=new ArrayList<>((int)Math.pow(2, n)); 18 List<String>result=geLeiMa(n, list1, list2); 19 StringBuilder stringBuilder=new StringBuilder((int)(Math.pow(2, n)*(n+3)+2)); 20 stringBuilder.append("["); 21 for(String temp:result){ 22 stringBuilder.append("\""); 23 stringBuilder.append(temp); 24 stringBuilder.append("\","); 25 } 26 stringBuilder.delete(stringBuilder.length()-1, stringBuilder.length()); 27 stringBuilder.append("]"); 28 System.out.println(stringBuilder.toString()); 29 } 30 scanner.close(); 31 } 32 33 private static List<String> geLeiMa(int n,List<String> list1,List<String> list2){ 34 //递归出口 35 if (n==1) { 36 list1.add("0"); 37 list1.add("1"); 38 return list1; 39 } 40 //递归求n-1位的格雷码 41 list1=geLeiMa(n-1,list1,list2); 42 //根据n-1位的格雷码求n位的格雷码 43 //比如求n=3的gray码,首先知道n=2的gray码是(00,01,11,10) 44 //那么n=3的gray码其实就是对n=2的gray码首位添加0或1生成的,添加0后变成(000,001,011,010) 45 //添加1后需要顺序反向就变成(110,111,101,100) 46 //组合在一起就是(000,001,011,010,110,111,101,100) 47 48 for(String temp:list1){ 49 list2.add("0"+temp); 50 } 51 for(int i=list1.size()-1;i>=0;i--){ 52 list2.add("1"+list1.get(i)); 53 } 54 list1.clear(); 55 list1.addAll(list2); 56 list2.clear(); 57 58 return list1; 59 } 60 61 }