text: package leetcode.algo.g;
  
  import java.util.ArrayList;
  
  /* The gray code is a binary numeral system where two successive values differ in only one bit.
   * Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
   * For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
   * 00 - 0
   * 01 - 1
   * 11 - 3
   * 10 - 2
   * Note:
   * For a given n, a gray code sequence is not uniquely defined.
   * For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.
   * For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
   */
  /* 镜射排列
   * n位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到
   */
  public class GrayCode2 {
  	public class Solution {
  	    public ArrayList<Integer> grayCode(int n) {
  	        if(n==0) {
  	            ArrayList<Integer> result = new ArrayList<Integer>();
  	            result.add(0);
  	            return result;
  	        }
  	        
  	        ArrayList<Integer> tmp = grayCode(n-1);
  	        int addNumber = 1 << (n-1);
  	        ArrayList<Integer> result = new ArrayList<Integer>(tmp);
  	        for(int i=tmp.size()-1;i>=0;i--) {
  	            result.add(addNumber + tmp.get(i));
  	        }
  	        return result;
  	    }
  	}
  }
  