LeetCode 89 Gray Code

来源:互联网 发布:魔兽世界月卡 知乎 编辑:程序博客网 时间:2024/04/27 23:38

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 - 001 - 111 - 310 - 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

0 0