[LeetCode#89]Gray Code

The problem:

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.

My analysis:

The solution behind is problem is very tricky, but elegant. 
The wiki link for the solution:
http://zh.wikipedia.org/wiki/格雷码#mediaviewer/File:Binary-reflected_Gray_code_construction.svg
The key idea: 
n's Gray code collection could be infered from n-1's gray code by following way:
1. first, we add '0' at the front of all gray code of n-1.
Since the '0' would not change the value of the gray code, we could just keep the n-1's gray integer.

2. Second, we reverse the n-1's gray code collection, and add '1' at the front of all gray code of n-1.
The method is very tricky, since the reverse can guarantee the two middle elements have the same gray code series.
00                      000
01                      001
10                      010
11 <--- the same        011 <--- prefix: 0
11 <--- the same        111 <--- prefix: 1
10                      110
01                      101
00                      100
What a tricky method!!!
The code for this is :
for (int i = 2; i <= n; i++) {
    for (int j = ret.size() - 1; j >= 0; j--) {
        ret.add(ret.get(j) + (1 << i - 1));
    }
}
Facts:
1. we won't delete the n-1's gray Iteger.
2. we scan the ArrayList from the end to the start.

A little skill:
How to get the interger value of n digits, and only the nth digit's value is 1, other's are 0.
9 digits: 100000000   1 << 8
n digits: 1 << n - 1 (This is a very important skill!!!not 1 << n).

My solution:

public class Solution {
    public List<Integer> grayCode(int n) {
        ArrayList<Integer> ret = new ArrayList<Integer> ();
        if (n < 0 || n > 32)
            return ret;
        if (n == 0) {
            ret.add(0);
            return ret;
        }
        ret.add(0);
        ret.add(1);
        for (int i = 2; i <= n; i++) {
            for (int j = ret.size() - 1; j >= 0; j--) {
                ret.add(ret.get(j) + (1 << i - 1));
            }
        }
        return ret;
    }
}