题目
格雷码是一个二进制数字系统,其中两个连续值仅在一个位上不同。 给定一个代表代码总位数的非负整数n,打印格雷码序列。 格雷码序列必须以0开头。 例如,给定n = 2,返回[0,1,3,2]。 其格雷码序列是: 00 - 0 01 - 1 11 - 3 10 - 2
分析思路
当n=1时,为[0,1] 当n=2时,为[00,01,11,10] 当n=3时,为[000,001,011,010,110,111,101,100] 由此可以看出新的序列其实是在前面序列基础上插入新的值 其中前半部分的数值不变,后半部分的数值为上个序列中每个元素第n个位变1,逆向插入
代码实现
//随着n变大,前面的数不用动,后面的数倒着拿出来再在首部加1即可
import java.util.*;
public class Solution {
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> result=new ArrayList<>();
if(n<0) return result;
result.add(0);
for(int i=0;i<n;i++){
int size=result.size();
for(int j=size-1;j>=0;j--){
result.add(result.get(j)+(1<<i));//第二遍反着遍历,形成对称
}
}
return result;
}
}
此题还可以使用位运算来解决:
import java.util.*;
public class Solution {
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> arr = new ArrayList<Integer>();
int num = 1 << n;
for(int i = 0; i < num; ++i){
arr.add(i>>1^i);
}
return arr;
}
}
题目和答案来自牛客网leetcode