题意:格雷码是一种二进制数值系统,两个连续的数值串只相差一位。输入非负整数n表示格雷码的位数,输出从0开始的格雷码序列,
声明:其实位数给定的格雷码序列并不唯一,但是测试答案只能测出一种
思路:递归,n位->(n-1)位->...2位->1位,数据结构类似stack,使用ArrayList<Integer>实现,(需要用到下标,元素从栈顶到栈底访问,但是不取出来),而用LinkedList实现更适合元素需要取出来的情形,顺着看和逆着看都是相差一位。
public List
grayCode(int n) { //n是非负整数
List
seqs;
if(n == 0){
return new ArrayList<>(Arrays.asList(0));
}
if(n == 1){
seqs = new ArrayList<>(Arrays.asList(0,1));
return seqs;
}
seqs = grayCode(n-1);
int pivot = 0x1 << (n-1); //将最高位置1
for(int i = seqs.size()-1; i >= 0; i--){
seqs.add(pivot + seqs.get(i));
}
return seqs;
}