格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。
给定一个非负整数n,表示代码的位数,打印格雷码的序列。格雷码序列必须以0开头。
例如:给定n=2,返回[0,1,3,2]. 格雷码的序列为:
00 - 0 01 - 1 11 - 3 10 - 2注意:
- 对于一个给定的n,格雷码的序列不一定是唯一的,
- 例如:根据题目描述,[0,2,3,1]也是一个有效的格雷码序列
00 - 0 01 - 1 11 - 3 10 - 2注意:
2
[0,1,3,2]
/*给定n,返回n位格雷码序列。例如:n=2,返回[0(00), 1(01), 3(11), 2(10)]
*n=1 返回 0 1
*n=2 返回 0 1 3 2
*n=3 返回 0 1 3 2 6 7 5 4
*观察规律:3=1+2,2=0+2; 6=2+4,7=3+4,5=1+4,4=0+4
*/
import java.util.*;
public class Solution {
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
if(n == 0)
return list;
list.add(1);
if(n == 1)
return list;
for(int i = 1;i < n;i ++) { //循环次数
int size = list.size();
int increase = (int)Math.pow(2, i); //增量
for(int j = size - 1;j >= 0;j --) {
list.add(list.get(j) + increase);
}
}
return list;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> result = new ArrayList<>();
if (n < 0)
return result;
if (n == 0) {
result.add(0);
return result;
}
result.add(0);
result.add(1);
for (int i = 2; i <= n; i++) {
int size = result.size();
for (int j = size - 1; j >= 0; j--) {
result.add(result.get(j) + (1<<(i-1)));
}
}
return result;
}
}
public static ArrayList<Integer> grayCode(int n) {
if (n == 0) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
return list;
}
if (n == 1) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
return list;
}
ArrayList<Integer> old = grayCode(n - 1);
int tempAdd = 1 << n - 1;
int len = old.size();
for (int i = len - 1; i >= 0; --i) {
old.add(old.get(i) + tempAdd);
}
return old;
}