89. Gray Code

格雷码序列生成算法
本文介绍了一种生成格雷码序列的有效算法。通过逐步扩展序列长度的方式,实现了n位格雷码的生成。该算法从一位格雷码开始,通过镜像变换和位运算逐步构造更长的序列。

89. Gray Code

题目

格雷码是一个二进制系统,两个相连的码字只有一位不相同。
给出一个非负整数n代表码字的总位数,输出格雷码序列。必须以0开始。

比如,给出n = 2,返回 [0,1,3,2]。它的格雷码序列是:
00 - 0
01 - 1
11 - 3
10 - 2
注意:
给出一个n, 格雷码序列并非唯一确定。
比如根据上述定义,[0,2,3,1]也是一个有效的格雷码序列。
现在,只能基于例子中的格雷码序列进行判断。

代码块

class Solution {
    public  static List<Integer> grayCode(int n) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(0);
        for(int i = 0; i < n; i++){
            int len = (int)Math.pow(2,i);
            for(int j = len - 1; j >= 0; j--){
                int gray = list.get(j) + len;
                list.add(gray);
            }
        }
        return list;
    }
     public static void main(String[] args) {
//          System.out.println(Math.pow(2, 4));
        System.out.println(grayCode(3));
    }
}

代码分析

本题是格雷码编码。
00 - 0
01 - 1
11 - 3
10 - 2

Created with Raphaël 2.1.000000000000101001001111101101110100100101101101001001011011111110.加01.加02.加03.加04.加1(1代表2的几次幂,增加了一位)5.加16.加17.加1

问题1:不会创建一个新的list,应该是new Array List ;
问题2: 将二进制转换成十进制时,需要进行类型转换,加(int),将double型变量转换成int型。Math.pow(i,j) 表示i的j次幂。
问题3:返回的是list,而不是gary。gray是列表中的取值,需要的是n位的格雷码,是一个数组,(list)。
问题4:因为是把n-1位的格雷码进行镜像变换的到的,所以需要j–。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值