89. Gray Code
题目
格雷码是一个二进制系统,两个相连的码字只有一位不相同。
给出一个非负整数n代表码字的总位数,输出格雷码序列。必须以0开始。
比如,给出n = 2,返回 [0,1,3,2]。它的格雷码序列是:
00 - 0
01 - 1
11 - 3
10 - 2
注意:
给出一个n, 格雷码序列并非唯一确定。
比如根据上述定义,[0,2,3,1]也是一个有效的格雷码序列。
现在,只能基于例子中的格雷码序列进行判断。
代码块
class Solution {
public static List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<Integer>();
list.add(0);
for(int i = 0; i < n; i++){
int len = (int)Math.pow(2,i);
for(int j = len - 1; j >= 0; j--){
int gray = list.get(j) + len;
list.add(gray);
}
}
return list;
}
public static void main(String[] args) {
// System.out.println(Math.pow(2, 4));
System.out.println(grayCode(3));
}
}
代码分析
本题是格雷码编码。
00 - 0
01 - 1
11 - 3
10 - 2
问题1:不会创建一个新的list,应该是new Array List ;
问题2: 将二进制转换成十进制时,需要进行类型转换,加(int),将double型变量转换成int型。Math.pow(i,j) 表示i的j次幂。
问题3:返回的是list,而不是gary。gray是列表中的取值,需要的是n位的格雷码,是一个数组,(list)。
问题4:因为是把n-1位的格雷码进行镜像变换的到的,所以需要j–。