public List<Integer> grayCode(int n) {
        List<Integer> ans = new ArrayList<Integer>();
        // 00 01 10 11
        // 000 001 010 011 | 111 110 101 100
        // 0000 0001 0010 0011 0111 0110 0101 0100 | 1100 1101 1110 1111 1011 1010 1001 1000
        ans.add(0);
        for (int i = 0; i < n; ++i) {
            int highBit = 1 << i; // left move 1 for i bit
            int len = ans.size();
            for (int j = len - 1; j >= 0; --j) {
                ans.add(highBit + ans.get(j));
            }
        }
        return ans;
    }