Gray Code leetcode java

愛做飯的小瑩子發表於2014-08-04

題目

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

程式碼如下:

 1     public ArrayList<Integer> grayCode(int n) {  
 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     }

 

相關文章