格雷码

问题格雷码是一个二进制的编码系统,相邻的两个数只有一位是不同的。
给定一个非负的整数n,代表了格雷码的位的总数。输出格雷码的序列,这个序列必须以0开始。

比如,给定n=2,输出[0,1,3,2],格雷码是
0 = 00
1 = 01
3 = 11
2 = 10

注:格雷码的序列并不是唯一,比如n=2时,[0,2,3,1]也满足条件。


分析:
格雷码的序列中应包含2^n个数。这个问题初看起来不容易,我们要想出一个生成方法。

对于n=2,序列是:
00,01,11,10
那对于n=3,如何利用n=2的序列呢?一个方法是,先在n=2的四个序列前加0(这其实是保持不变),然后再考虑把最高位变成1,只需要把方向反过来就可以了
000,001,011,010
100,101,111,110-> 110,111,101,100
把这两行合起来就可以得到新的序列。

想通了,写代码就很容易了。

public  class Solution {
     public ArrayList<Integer> grayCode( int n) {
        ArrayList<Integer> result =  new ArrayList<Integer>();
        result.add(0);
         if(n>0){
            result.add(1);
        }
        
         int mask = 1;
         for( int i=2;i<=n;++i){
            mask *= 2;
             for( int j=result.size()-1;j>=0;--j){
                 int v = result.get(j).intValue();
                v |= mask;
                result.add(v);
            }
        }
         return result;
    }
}

你可能感兴趣的:(格雷码)