华为机试---生成格雷码



题目描述

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

你可能感兴趣的:(java,华为)