格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异。
给定一个非负整数 n
,表示该代码中所有二进制的总数,请找出其格雷编码顺序。一个格雷编码顺序必须以 0
开始,并覆盖所有的 2n 个整数。
注意事项
对于给定的 n
,其格雷编码顺序并不唯一。
根据以上定义, [0,2,3,1]
也是一个有效的格雷编码顺序。
样例
给定 n = 2
, 返回 [0,1,3,2]
。其格雷编码顺序为:
00 - 0
01 - 1
11 - 3
10 - 2
挑战
O(2n) 时间复杂度。
public class Solution {
/**
* @param n a number
* @return Gray code
*/
public ArrayList<Integer> grayCode(int n) {
// Write your code here
ArrayList<Integer> result=new ArrayList<Integer>();
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=0;j<size;j++){
int value=result.get(j);
String s=Integer.toBinaryString(value);
String zero=s;
String one=s;
if(j%2==0){
zero+="0";
one+="1";
}else{
zero+="1";
one+="0";
}
result.add(fun(zero));
result.add(fun(one));
}
result.subList(0, size).clear();;
}
return result;
}
private static int fun(String s){
int length=s.length();
int result=0;
for(int i=0;i<s.length();i++){
result+=Integer.parseInt(s.charAt(i)+"")*Math.pow(2, length-i-1);
}
return result;
}
}