做法,先给result赋初始值为0,并给出一个k,k在每次外循环都会左移一位,然后在内循环中 和result中的每个元素(逆序,为什么要逆序?因为我们通过观察格雷码可以发现,n位格雷码,除了最左位,一头一尾是对称的,可以参考本文最下方的链接看别人的分析)作一个异或运算,并将结果放到result中。
public static List<Integer> grayCode(int n) {
List<Integer> result = new LinkedList<>();
if (n >= 0) {
result.add(0);
int k = 1;
for (int i = 0; i < n; i++) {
for (int j = result.size() - 1; j >= 0; j--) { //逆序异或
result.add(result.get(j) ^ k); // ^ <==> 异或 同为0, 异为1
}
k <<= 1;
}
}
return result;
}
本题的思想参考于:http://blog.youkuaiyun.com/beiyeqingteng/article/details/7044471
上面的方法如果觉得太难想,还是用普通的方法
public String[] GrayCode(int n) {
// produce 2^n grade codes
String[] graycode = new String[(int) Math.pow(2, n)];
if (n == 1) {
graycode[0] = "0";
graycode[1] = "1";
return graycode;
}
String[] last = GrayCode(n - 1);
for (int i = 0; i < last.length; i++) {
graycode[i] = "0" + last[i];
graycode[graycode.length - 1 - i] = "1" + last[i];
}
return graycode;
}