给定一个非负整数n,表示代码的位数,打印格雷码的序列java实现

题目描述

格雷码是一种二进制编码系统,如果任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(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;
    }
}
发布了32 篇原创文章 · 获赞 1 · 访问量 335

猜你喜欢

转载自blog.csdn.net/zy854816286/article/details/104950952