格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异。
给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序。一个格雷编码顺序必须以 0 开始,并覆盖所有的 2n 个整数。
注意事项
对于给定的 n,其格雷编码顺序并不唯一。
根据以上定义, [0,2,3,1] 也是一个有效的格雷编码顺序。
样例
给定 n = 2, 返回 [0,1,3,2]。其格雷编码顺序为:
00 - 0
01 - 1
11 - 3
10 - 2
参考格雷码与二进制的转换知道了二进制编码与格雷编码的转换方式,题目就简单了。
递归,得到所有二进制编码,然后转换一下就可以了。
代码:
public class Solution {
/*
* @param n: a number
* @return: Gray code
*/
public List<Integer> grayCode(int n) {
// write your code here
List<Integer> res=new ArrayList<Integer>();
List<Integer> tempResult=new ArrayList<Integer>();
recursion(res,tempResult,n);
return res;
}
public static int recursion(List<Integer> res,List<Integer> tempResult,int n){
if(tempResult.size()==n){
int temp=0;
for (int i=0;i<tempResult.size();i++){
temp=temp*2+tempResult.get(i);
}
temp=temp^(temp>>1);
res.add(new Integer(temp));
return 1;
}
for(int i=0;i<2;i++){
tempResult.add(i);
recursion(res,tempResult,n);
tempResult.remove(tempResult.size()-1);
}
return 1;
}
}