`

Gray Code

阅读更多
首先简单介绍一下什么是格雷码。在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。有关格雷码的详细讲解请大家查阅网上其它资料,这里主要讲解格雷码是如何编码的。

我们不妨从简单例子开始进一步看一下什么是格雷码,假设n代表格雷码的位数,当n=1时,我们只有两种选择(0, 1); 当 n =2 时,格雷码为(00, 01, 11, 10); 当n = 3时,格雷码为(000, 001, 011,010, 110, 111, 101, 100);我们发现了一个规律,就是每当增加一位,新的格雷码的前半段都是在之前的格雷码前面加上一个零,红色地方代表了格雷码的前半段。而后半段就是从后面开始在前面加上1。通过这种方式就可以写出任意位数的格雷码。

leetcode中有一道题目是关于格雷码的,在这里列举一下。给定一个整数n,输出它的格雷码序列。格雷码序列不唯一,输出一种就可以。按照上面的编码规则,我们不难写出代码,代码如下:
public class Solution {
    public List<Integer> grayCode(int n) {
        List<Integer> list = new ArrayList<Integer>();
        if(n < 0) return list;
        list.add(0);
        for(int i = 1; i <= n; i++) 
            for(int j = list.size() - 1; j >= 0; j--) {
                list.add(list.get(j) + (int)Math.pow(2, i - 1));
            }
        return list;
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics