gray-code(格雷码)

3人阅读 评论(0) 收藏 举报
分类:

题目

格雷码是一个二进制数字系统,其中两个连续值仅在一个位上不同。

给定一个代表代码总位数的非负整数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

查看评论

Excel项目实战从入门到精通(兼容2007、2010、2013、2016)

用Excel完成生活、学习和工作中的数个具有代表性的典型应用
  • 2016年11月19日 18:32

算法学习 - Gray Code(格雷码)的解释和c++实现

Gray Code(格雷码) 典型的二进制格雷码(Binary Gray Code)简称格雷码。当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。 特点是:一组数的编码中,若任意两个相...
  • chenfs1992
  • chenfs1992
  • 2014-12-11 02:23:19
  • 2969

gray-code格雷码

题目: The gray code is a binary numeral system where two successive values differ in only one bit. G...
  • u014253011
  • u014253011
  • 2018-04-21 22:25:18
  • 4

Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码

一般的,在Verilog中最常用的编码方式有二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码。 二进制码和格雷码是压缩状态编码。 若使用格雷编码,则相邻...
  • a8039974
  • a8039974
  • 2014-05-25 07:47:38
  • 2252

格雷码Gray Code

http://blog.csdn.net/pipisorry/article/details/72356418格雷码简介  在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格...
  • pipisorry
  • pipisorry
  • 2017-05-18 11:02:47
  • 2345

Gray Code实现

问题:产生n位元的所有格雷码。 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。 例如以下为3位元的格雷码...
  • huanghanqian
  • huanghanqian
  • 2016-04-03 09:37:32
  • 156

C++递归生成格雷码

一、格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。 例如以下为3位元的格雷码: 000 001 011 0...
  • yzl20092856
  • yzl20092856
  • 2015-09-07 21:00:44
  • 2466

格雷码递归实现(c++)

void _GrayCode(int n, vector& graySeq) { if(n == 1) { graySeq.push_back("0"); graySeq.push_bac...
  • u012409883
  • u012409883
  • 2015-09-09 15:27:35
  • 983

格雷码与二进制的转换

一、什么是格雷码?格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同,这点在下面会详细讲解到。格雷码的基本特点...
  • jingfengvae
  • jingfengvae
  • 2016-06-16 13:02:09
  • 39357

[leetcode](Gray Code 格雷码 C语言实现)

Gray Code The gray code is a binary numeral system where two successive values differ in only one b...
  • sanmao0816
  • sanmao0816
  • 2015-04-19 18:22:14
  • 1187
    个人资料
    持之以恒
    等级:
    访问量: 4092
    积分: 529
    排名: 9万+
    文章存档
    最新评论