【leetcode】No.89:gray-code

2019-08-26  本文已影响0人  I讨厌鬼I

题目描述

格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)
给定一个非负整数n,表示代码的位数,打印格雷码的序列。格雷码序列必须以0开头。
例如:给定n=2,返回[0,1,3,2]. 格雷码的序列为:

00 - 0
01 - 1
11 - 3
10 - 2

注意
对于一个给定的n,格雷码的序列不一定是唯一的,
例如:根据题目描述,[0,2,3,1]也是一个有效的格雷码序列

思路:


仔细观察上图,从后往前拿出数字,在最高位前面加1,因为最高位前面总是0,新加入的数字可以与尾部数字只有最高位前一位不同,而因为之前的序列是满足只有一位不同的,由于新的数字最高位都为1,所以这些数字也是满足要求的,而且这样可以保证遍历所有的情况。

代码:

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> grayCode(int n) {
        ArrayList<Integer> res = new ArrayList();
        res.add(0);
        for (int i=0; i<n; i++){
            for (int j=res.size()-1; j>=0; j--){
                int num = res.get(j);
                num = num|(1<<i);
                res.add(num);
            }
        }
        return res;
    }
}
上一篇下一篇

猜你喜欢

热点阅读