/*
一位是: 0, 1
两位是: 00, 01, 11, 10
三位是:000,001,011,010,110,111,101,100
思路就是 从低位到高位 前一半的 只需要在低位每个数前+0 后一半 需要在每位数之前添1 并且 翻转顺序
用递归 拆解步骤为 上述思路
出口是 n = 0 时 输出 0;
n = 1 时 输出 0, 1;
*/
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<Integer>();
// if (n == 0) {
// result.add(0);
// return result;
// } else if (n == 1) {
// result.add(0);
// result.add(1);
// return result;
// }
if(n <= 1) {//递归的出口;n = 0 时 输出 0;n = 1 时 输出 0, 1;
for(int i = 0; i <= n; i++) {
result.add(i);
}
return result;
}
List<Integer> temp = grayCode(n - 1);//此处得到的是 n-1位时的结果 需要做思路里面的处理;
// for (int i = 0; i < temp.size()*2; i++) {
// if (i < temp.size()) result.add(temp.get(i));
// else {
// int j = temp.get(temp.size()-(i-temp.size())-1);
// j += 1 << (n-1);
// result.add(j);
// }
// }
for(int i = 0; i < temp.size(); i++) {
int j = (1 << n - 1) + temp.get(temp.size() - i - 1);
result.add(j);
}
temp.addAll(result);
return temp;
}
}