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.
先来看看格雷码长什么样:
2位格雷码 | 3位格雷码 | 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
|
|
3位格雷码可以由2位格雷码构造,3位的格雷码,首先是0,然后加上二位的格雷码构成前半部分,然后是1,倒着加上二位的格雷码构成后半部分。
再看4位的格雷码和3位的构造方法一样,可以应用这个规律构造下去。
public List<Integer> grayCode(int n)
{
List<Integer> retlist=new ArrayList<>();
String[] strs=getcode(n);
for(String s : strs)
retlist.add(Integer.parseInt(s, 2));
return retlist;
}
private String[] getcode(int n)
{
if(n==0)
return new String[] {"0"};
if(n==1)
return new String[] {"0","1"};
String[] laststrs=getcode(n-1);
int len=laststrs.length<<1;
String[] retstrs=new String[len];
for(int i=0;i<len/2;i++)
retstrs[i]="0"+laststrs[i];
for(int i=len-1,k=0;i>=len/2;i--,k++)
retstrs[i]="1"+laststrs[k];
return retstrs;
}