Gray Code

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

我们不妨从简单例子开始进一步看一下什么是格雷码,假设n代表格雷码的位数,当n=1时,我们只有两种选择([color=red]0, 1[/color]); 当 n =2 时,格雷码为([color=red]00, 01[/color], 11, 10); 当n = 3时,格雷码为([color=red]000, 001, 011,010,[/color] 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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值