解题(GeLeiMa -生成格雷码)

题目描述 

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

猜你喜欢

转载自www.cnblogs.com/hzy1234/p/9358662.html