格雷编码
题目:n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)。第一个整数是0,一个整数在序列中出现不超过一次,每对相邻整数的二进制表示恰好一位不同 ,且第一个 和最后一个整数的二进制表示恰好一位不同。给你一个整数n ,返回任一有效的n位格雷码序列 。
输入:n = 2
输出:[0,1,3,2]
方法一:递归生成。下图可以看出,3位格雷码的前4个和2位相同,后四个是在2位逆序的基础上在最高位置1。
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<>();
list.add(0);
for(int i = 0; i < n; i++){
int len = list.size();
for(int j = len - 1; j >= 0; j--){
list.add(list.get(j) | 1 << i);
}
}
return list;
}
}
方法二:二进制转换。二进制转换公式如下,即将原数右移一位和原数做异或。
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 1 << n; i++){
list.add((i >> 1) ^ i);
}
return list;
}
}