/**89. Gray Code
* @param n
* @return
*/
public List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<Integer>();
int count = (int) Math.pow(2,n);
int[] nums = new int[n];
if (n == 0) {
list.add(0);
return list;
}
for (int i = 0; i < count; i++) {
int j = i;
int k = n-1;
while(j > 0) {
nums[k--] = j%2;
j = j/2;
}
int val = 0;
j = 1;
for(k = n-1; k > 0; k--) {
nums[k] = nums[k]^nums[k-1];
val += nums[k]*j;
j = j*2;
}
val += nums[0]*j;
list.add(val);
}
return list;
}
//n=0时输出[0]
改进:利用格雷码性质
public List<Integer> grayCode1(int n) {
List<Integer> gray = new ArrayList<Integer>();
for(int i = 0 ; i < 1<<n ; i++) {
int temp = i>>1;
gray.add(i^temp);
}
return gray;
}