题目描述
格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。
给定一个非负整数n,表示代码的位数,打印格雷码的序列。格雷码序列必须以0开头。
例如:给定n=2,返回[0,1,3,2]. 格雷码的序列为:
00 - 0↵01 - 1↵11 - 3↵10 - 2
思路:
格雷码随着位数增加,实际上是在前一位格雷码基础上的扩展,将前一位的格雷码倒序排列,再在首位加1,就构成了这一位的格雷码
代码需要用到<<位运算:
<<:是逻辑左移,右边补0,符号位和其他位一样要移动。
数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
A=60(00111100) B=13(00001101)
计算:3 << 2
3 << 2,则是将数字3左移2位
1、首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011
2、然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。
3、则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> dp=new ArrayList<Integer>();
if(n<1){
dp.add(0);
return dp;
}
dp.add(0);
dp.add(1);
if(n==1)
return dp;
for(int i=2;i<=n;i++){
for(int j=dp.size()-1;j>=0;j--){
dp.add(dp.get(j)+(1<<(i-1)));
}
}
return dp;
}
}