LeetCode 89 Gray Code

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

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

Note:
For a given n, a gray code sequence is not uniquely defined.

For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

这道题的要求是按顺序生成所有n位格雷码。

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。

二进制数转格雷码

(假设以二进制为0的值做为格雷码的0)

G:格雷码 B:二进制码

G(N) = (B(n)/2) XOR B(n)

"^" XOR operation, for example, 2 (0010) ^ 7 (0111) => 5 (0101)

	public List<Integer> grayCode(int n) {
		int pow = 1 << n;
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < pow; i++)
			list.add(i >> 1 ^ i);
		return list;
	}

然后我们来看看其他的解法,参考维基百科上关于格雷码的性质,有一条是说镜面排列的,n位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到,如下图所示一般。

	public List<Integer> grayCode2(int n) {
		if (n == 0) return Arrays.asList(0);
		List<Integer> prev = grayCode(n - 1);
		List<Integer> next = new ArrayList<Integer>(prev);
		int pow = 1 << (n - 1);
		for (int i = prev.size() - 1; i >= 0; i--) {
			next.add(prev.get(i) | pow);
		}
		return next;
	}




参考:

http://blog.csdn.net/makuiyu/article/details/44926463

http://www.matrix67.com/blog/archives/266,Matrix67还有八皇后问题的讲解

http://www.cnblogs.com/grandyang/p/4315607.html

http://www.cnblogs.com/grandyang/p/4315649.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值