LeetCode——格雷编码

Q:格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。
给定一个非负整数n,表示代码的位数,打印格雷码的序列。格雷码序列必须以0开头。
例如:给定n=2,返回[0,1,3,2]. 格雷码的序列为:
00 - 0↵01 - 1↵11 - 3↵10 - 2
注意:
对于一个给定的n,格雷码的序列不一定是唯一的,
例如:根据题目描述,[0,2,3,1]也是一个有效的格雷码序列
A:
1.(感谢@可乐猪)随着n变大,前面的数不用动,后面的数倒着拿出来再在首部加1即可

    public ArrayList<Integer> grayCode(int n) {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(0);
        for (int i = 0; i < n; i++) {
            int high = 1 << i;
            for (int j = array.size() - 1; j >= 0; j--) {
                array.add(high | array.get(j));
            }
        }
        return array;
    }

2.G(i)=i^(i/2)(这个我没看懂为什么……)

    public ArrayList<Integer> grayCode(int n){
         ArrayList<Integer> result=new ArrayList<>();
         for(int i=0;i<1<<n;i++){
                result.add(i^i>>1);//先算位移运算再算异或运算
          }
    }
posted @ 2020-03-20 17:36  Shaw_喆宇  阅读(247)  评论(0编辑  收藏  举报