題目:
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位的格雷碼由兩部分構成,一部分是n-1位格雷碼,再加上 1<<(n-1)和n-1位格雷碼的逆序(整個格雷碼逆序0132變成2310這種)的和。
1位格雷碼有兩個碼字
(n+1)位格雷碼中的前2^n個碼字等於n位格雷碼的碼字,按順序書寫,加字首0
(n+1)位格雷碼中的後2^n個碼字等於n位格雷碼的碼字,按逆序書寫,加字首1。
由於是二進位制,在最高位加0跟原來的數本質沒有改變,所以取得上一位算出的格雷碼結果,再加上逆序添1的方法就是當前這位格雷碼的結果了。
n = 0時,[0]
n = 1時,[0,1]
n = 2時,[00,01,11,10]
n = 3時,[000,001,011,010,110,111,101,100]
當n=1時,0,1
當n=2時,原來的list 0,1不變,只是前面形式上加了個0變成00,01。然後加數是1<<1為10,依次:10+1=11 10+0=10。結果為:00 01 11 10
當n=3時,原來的list 00,01,11, 10(倒序為:10,11,01,00)。加數1<<2為100。倒序相加為:100+10=110, 100+11=111,100+01=101, 100+00= 100。
最終結果為000 001 011 010 110 111 101 100
程式碼如下:
2 if(n==0) {
3 ArrayList<Integer> result = new ArrayList<Integer>();
4 result.add(0);
5 return result;
6 }
7
8 ArrayList<Integer> result = grayCode(n-1);
9 int addNumber = 1 << (n-1);
10 int originalsize=result.size();
11
12 for(int i=originalsize-1;i>=0;i--) {
13 result.add(addNumber + result.get(i));
14 }
15 return result;
16 }