Gray Code leetcode java


題目

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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM