Q:格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。
给定一个非负整数n,表示代码的位数,打印格雷码的序列。格雷码序列必须以0开头。
例如:给定n=2,返回[0,1,3,2]. 格雷码的序列为:
00 - 0↵01 - 1↵11 - 3↵10 - 2
注意:
对于一个给定的n,格雷码的序列不一定是唯一的,
例如:根据题目描述,[0,2,3,1]也是一个有效的格雷码序列
A:
1.(感谢@可乐猪)随着n变大,前面的数不用动,后面的数倒着拿出来再在首部加1即可
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> array = new ArrayList<>();
array.add(0);
for (int i = 0; i < n; i++) {
int high = 1 << i;
for (int j = array.size() - 1; j >= 0; j--) {
array.add(high | array.get(j));
}
}
return array;
}
2.G(i)=i^(i/2)(这个我没看懂为什么……)
public ArrayList<Integer> grayCode(int n){
ArrayList<Integer> result=new ArrayList<>();
for(int i=0;i<1<<n;i++){
result.add(i^i>>1);//先算位移运算再算异或运算
}
}