public ArrayList<Integer> grayCode(int n) {
    	ArrayList<Integer> ret = new ArrayList<Integer>();
    	ArrayList<String> arr = new ArrayList<String>();
    	arr.add("0");
    	arr.add("0");
    	arr.add("1");
    	for (int i = 2; i <= n; i++)
    	{
    		int idx_begin = (int)(Math.pow(2, i - 1) - 1);
    		int idx_end = (int)(Math.pow(2, i) - 1);
    		for (int j = idx_begin; j < idx_end; j++)
    			arr.add("0" + arr.get(j));
    		for (int j = idx_end - 1; j >= idx_begin; j--)
    			arr.add("1" + arr.get(j));
    	}
		int ibegin = (int)(Math.pow(2, n) - 1);
		int iend = (int)(Math.pow(2, n + 1) - 1);
		for (int i = ibegin; i < iend; i++)
		{
			String str = arr.get(i);
			int num = 0;
			int idx = 0;
			while (idx < str.length())
				num = num * 2 + (str.charAt(idx++) - '0');
			ret.add(num);
		}
    	return ret;
    }