Gray Code(Leetcode 89)
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.
public class Solution { public List<Integer> grayCode(int n) { List list=new LinkedList<>(); int length=1<<n; for(int i=0;i<length;i++) list.add(i^(i>>1)); return list; } }
相邻两数的格雷码,仅仅有一位二进制发生变化。
而且在其范围内的最小值和最大值,也仅仅有一位二进制发生变化。
以三位为例:
000^000-->000
001^000-->001
010^001-->011
011^001-->010
100^010-->110
101^010-->111
110^011-->101
111^011-->100
每两个数字作为一组,每组之间都只会差一个数字,即最后一位,第一个是0,第二个是1.组内的两个数字与之异或的数字是相同的,所以保证了组内变换后两个数字一定会有差别,而且只会有一位差别.
组与组之间靠近的两个数字,后面一个将前面一个数字最右方连续的1全部置为0,然后在连续1前面一位置为1,而与他们异或的格式也很是类似。全都相对于本身右移一位,结果两两异或,数字相同的(1与1、0与0)结果为0,只在原本自身相对变化的两位出现交替,后面一个数字比前面一个数字在最前方多了一个1.
这样组内、组间都与前面数字差一位,保证了Gray Code的间隔都为1,而最大的数字与最小的数字也只差一位,因为异或的特性,使后面部分都变为了0.
递归生成码表
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
2位格雷码 | 3位格雷码 | 4位格雷码 | 4位自然二进制码 |
---|---|---|---|
00
01
11
10
|
000
001
011
010
110
111
101
100
|
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
|
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
|