https://oj.leetcode.com/problems/gray-code/

public class Solution {
    public List grayCode(int n) 
    {
        // 规律:
        // 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 结果集 为 s
        // 正序 每一个 i,头部加入 0,放入新结果集
        // 倒序 每一个 i,头部加入 1,放入新结果集

        if (n < 0)
            return Collections.emptyList();
            
        if (n == 0)
            return Collections.singletonList(0);
        
        List str = code(n);
        List toReturn = new ArrayList<>();
        for (String s : str)
        {
            toReturn.add(Integer.parseInt(s, 2));
        }
        return toReturn;
    }
    
    private List code(int n)
    {
        if (n == 1)
        {
            List toReturn = new ArrayList<>();
            toReturn.add("0");
            toReturn.add("1");
            return toReturn;
        }
        
        List last = code(n - 1);
        List toReturn = new ArrayList<>();
        // for each e in last, append 0, to head. and into new result
        for (String s : last)
        {
            toReturn.add("0" + s);
        }
        // for each e in last (reverse), and append (1) in it.
        for (int i = last.size() - 1 ; i >= 0 ; i --)
        {
            toReturn.add("1" + last.get(i));
        }
        return toReturn;
    }
}