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.
[解题思路]
000
001
011
010
110
111
101
100
1 public class Solution { 2 public ArrayList<Integer> grayCode(int n) { 3 // Start typing your Java solution below 4 // DO NOT write main() function 5 ArrayList<Integer> result = new ArrayList<Integer>(); 6 if(n <= 1){ 7 result.add(0); 8 if(n == 1){ 9 result.add(1); 10 } 11 return result; 12 } 13 14 ArrayList<Integer> pre = grayCode(n - 1); 15 int highest = 1 << (n - 1); 16 result.addAll(pre); 17 for(int i = pre.size() - 1; i >= 0 ; i --){ 18 result.add(pre.get(i) + highest); 19 } 20 return result; 21 } 22 }
解2:
二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
格雷码->二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。
1 public ArrayList<Integer> grayCode(int n) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 ArrayList<Integer> result = new ArrayList<Integer>(); 5 int count = 1 << n; 6 for(int i = 0; i < count; i++){ 7 result.add(i^(i >> 1)); 8 } 9 10 return result; 11 }