【LeetCode 89】格雷编码 构建法和自然二进制编码转化法

自然二进制数与格雷码的相互转换 自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。 阅读详情

题目:

在这里插入图片描述

思考:

  • 首先,补充一下格雷码的含义:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码。例如,位数为2格雷码的其中一个序列:00,01,11,10,它们任意两个相邻的数值,只有一个位数不同。
  • 解题思路:如果我们书写三位的格雷码的一个序列:000,001,011,010,110,111,101,100。我们会发现一个奇怪的现象,前面四个数,跟后面四个数,第一位不同,后面刚好后四个数的顺序是前四个数的逆序。通过查阅资料,可知,这是由于格雷码是反射二进制码,我们根据这一特点,利用递归的如下规则来构造:
    • 1位格雷码有两个,n位的格雷码有2*n个
    • (n+1)位格雷码中的前n个码字等于n位格雷码的码字,按顺序书写,加前缀0
    • (n+1)位格雷码中的后n个码字等于n位格雷码的码字,按逆序书写,加前缀1
    • n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1

代码:

	public List<Integer> grayCode(int n) {
        List<Integer> list = new ArrayList<>();
        if (n == 0) {
            list.add(0);
            return list;
        }

		// 这里获得格雷码的二进制码的形式,再将二进制码转为数字
        String[] grayCode = getGrayCode(n);
        for (String s : grayCode
        ) {
            list.add(Integer.parseInt(s, 2));
        }
        return list;
    }

    private String[] getGrayCode(int n) {
        if (n == 1) {
            return new String[]{"0", "1"};
        }

        String[] temp = getGrayCode(n - 1);
        String[] result = new String[temp.length * 2];
        for (int i = 0; i < temp.length; i++) {
     	    // n位格雷码集合(顺序)加前缀0 
            result[i] = "0" + temp[i];
            // n位格雷码集合(逆序)加前缀1
            result[result.length - i - 1] = "1" + temp[i];
        }
        return result;
    }

自然二进制做法:

还有一种做法,是利用自然二进制码,直接转为格雷编码,方法为:将自然二进制码右移一位,与原自然二进制码进行异或操作,即可得到格雷编码。
具体的代码:

	public List<Integer> grayCode1(int n) {
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < 1 << n; i++) {
            result.add(i ^ i >> 1);
        }
        return result;
    }

自然二进制做法解析:

关于这个规律,为什么能从自然二进制码转为格雷编码,这里按自己的理解解释一下:

  • 对于自然二进制码,进行自增,有两种情况,一种是进位,一种是末位从0变成1。而格雷编码需要对应自然二进制码这两种自增情况时,都只发生一位的修改。
  • 而算法,是将自然二进制码右移一位,与原自然二进制码进行异或操作,对于一个n位的自然二进制数,该变化即保留了最高位不变,有n-1次异或操作,而该格雷码就是最高位加上n-1次异或操作的结果进行拼接。我们现在就需要讨论当二进制编码自增,发生上述两种情况时,格雷编码是否能保证只发生了一位修改。
  • 首先考虑,自然二进制码没有发生进位的情况。此时,最后一位,实际上只参与了一组异或计算,即n-1组异或操作,会有一组的值发生了变化,即符合只发生了一位的修改。(下面举例从 0010 -> 0011)
    在这里插入图片描述
  • 第二种情况,即发生进位。比如进位,会导致后面m位都发生变化,即但后面m-1组的异或中,两个元素同时变,因此异或结果没有变。而第m组,只有一个参数发生变化,因此会导致异或计算结果不同。即总体发生一组值的变化,也符合发生了一位的修改。(下面举例从 0011 -> 0100)
    在这里插入图片描述
  • 综上两种情况,可以推断该算法确实可以将自然二进制码转为格雷编码。

相关其他链接

其他 LeetCode 题目
LeetCode Top 100 Liked Questions 题目

verilog实现格雷码与二进制的转化 verilog实现格雷码与二进制的转化:     1)自然二进制码转换为格雷码的方法         自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高    位相异或,而格雷码其余各位与次高位的求法相类似。          原理: 若二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0];     ... 阅读详情

相关推荐

格雷码与二进制之间的转换

一、格雷码简介 格雷码(Binary Gray Code),是指在一组数的编码中,任意两个相邻的代码只有一位二进制数不同,这使得它在递增或递减的过程中,每次只变化一位。但是相对于二进制计数,它也有它的不足,那就是循环技术深度必须是2的N次幂,否则就失去了每位只变化一位的特性。下边给出了深度为16的二进制及格雷码递变表。 Binary Gray 0000 0000 0001 0001 0010 ...

求学者 6676

自然二进制码与格雷码相互转换

自然二进制码与格雷码相互转换 一、格雷码简介 格雷码是由弗兰克·格雷于1953年发明,其主要特点是相邻编码值中间只有一个比特发生改变,又被称为循环码。 格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。 二、自然二进制码转换为格雷码 自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,格雷

GitHDL的博客 4644

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2726

自然二进制码与格雷码相互转换【优快云】

自然二进制码与格雷码相互转换 一、格雷码简介 格雷码是由弗兰克·格雷于1953年发明,其主要特点是相邻编码值中间只有一个比特发生改变,又被称为循环码。 格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。 二、自然二进制码转换为格雷码 自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,格雷

Jensen Lee的博客 2449

工业视觉开发者的福音:用C#玩转VisionMaster算子(非方案版完整教程)

本文为工业视觉开发者提供了一份完整的C#与VisionMaster算子二次开发教程,详细介绍了环境配置、算子调用原理、性能优化技巧及实战案例。通过模板匹配和二维码识别等实例,展示了如何高效集成VisionMaster算子到现有框架中,提升工业自动化视觉检测系统的灵活性和性能。

weixin_29280657的博客 270

大疆C板使用C610电调驱动M2006电机(hal库)

大疆C板使用C610电调驱动M2006电机,以及遇到代码没问题,但是电机死活不转的处理

qq_46210601的博客 6014

二进制格雷码与自然二进制码之间的转换

什么是格雷码? 格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同。 二进制格雷码与自然二进制码的互换 1、二进制码转换成二进制格雷码 法则是保留二进制码的最高位作为格雷码的最高位;次高位格雷码为二进制码的高位与次高位相异或,其余各位类似。 static unsigned int Dec...

zyc2018的博客 6474

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 321

LeetCode89-格雷编码

哇,早上起来一看CCF的分数 心情立马由开心跌倒了谷底 什么操蛋的玩意儿 我只有190分 我不信我不信我不信 哎 牢骚过后还是得老老实实干活儿! 今天一定要买块蛋糕安慰自己 89-格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: ...

飞奔的菜猪的博客 252

WPF基础系列六:MVVM框架

MVVM框架 文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例 前言 在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。 与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过

iceberg7012的博客 2万+

YOLO11涨点优化:创新多尺度卷积注意力(MSCA)模块,小目标检测神器!

MSCA模块通过创新的多尺度设计,在保持计算效率的同时显著提升小目标检测能力。实验证明,在YOLOv5/v8等模型上嵌入MSCA后,mAP提升超过2%,小目标检测精度提升近4%,且计算代价增加极小。注意力机制的未来发展方向动态核尺寸:根据输入特征自适应调整卷积核大小跨模态融合:结合RGB与深度/热力图等多模态信息自监督优化:利用对比学习预训练注意力模块尝试在你的YOLO模型中插入MSCA模块,欢迎在评论区分享你的涨点结果!参考文献。

QQ_778132974的博客 470

leetcode89:js格雷编码

题目:格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0...

sinat_41747081的博客 159

复现论文《大规模风电场电磁暂态高效建模仿真方法》

本文提出了一种针对大规模风电场电磁暂态(EMT)仿真的高效建模方法。通过三种关键技术实现仿真加速:(1)永磁直驱风电机组一体化等效建模,采用节点导纳矩阵降维将25节点机组简化为4端子电路,仿真速度提升1-3个数量级;(2)基于戴维南/诺顿等效和OpenMP并行计算的风电场整体建模,通过串并联叠加实现节点收缩,30台机组仿真加速近万倍;(3)受控源映射解耦方法提高故障仿真灵活性。复现代码展示了核心算法实现,包括导纳矩阵Schur补降维、多进程并行计算框架以及受控源解耦方法。

huanghm88的专栏 277

Leetcode 89:格雷编码(超详细的解法!!!)

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 ...

coordinate的博客 2079

YOLOv11改进 | 注意力篇 | YOLOv11引入24年ECCV的自调制特征聚合注意力模块(SMFA),并构建C2PSA_SMFA

1.SMFA介绍1.1 摘要:基于Transformer的图像复原方法由于Transformer的自注意(self-attention,SA)特性能够更好地挖掘非局部信息,从而获得更好的高分辨率图像重建效果,因此具有重要的应用价值。然而,关键点积SA需要大量的计算资源,这限制了其在低功耗器件中的应用。此外,模拟退火机制的低通特性限制了其捕获局部细节的能力,从而导致平滑的重建结果。

tsg6698的博客 952

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS LeetCode ☞ 格雷编码

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。 格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0

HumorousGhost 341

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

移位和格雷编码

移位运算和格雷编码

qq_53511990的博客 313

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode高频面试题81-100解析与解题技巧

算法与数据结构是程序员面试的核心考察点,其中二分查找、动态规划和树形结构等经典问题频繁出现。理解这些基础算法的原理与变体应用,能有效提升解题效率。以LeetCode Top 100高频面试题为例,第81-100题往往需要综合运用多种技巧,如处理旋转排序数组中的二分查找变体、二维动态规划的状态转移优化等。掌握模式识别能力和标准化解题流程,比单纯追求刷题数量更重要。本文通过典型例题如搜索旋转排序数组II、最大矩形等,详解如何避免常见错误,并分享面试中的时间分配与代码优化策略。

405

格雷码

格雷码    格雷码 格雷码(Gray code),又叫循环二进制码或反射二进制码 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方

c00lb0ycw的专栏 5209

格雷码在异步FIFO中的应用

格雷码在异步FIFO中的应用 2018年7月1日 22点44分 1.格雷码的介绍 在介绍格雷码之前,我们先说说自然二进制码,也就是我们经常说的二进制数。 我们用二进制数表示一个变化的数值,例如,用一个8位的二进制数表示热水壶的温度,温度是不断连续变化的,36°C、37°C、38°C……,那么温度每升高一度,二进制数就加1。这时候,二进制数有可能是多个位同时变化的:当温度由119°C变成...

i540113104的专栏 1595

自然二进制和格雷码之间的转换

(1)自然二进制数转换到格雷码 设有 N 位二进制数 B(i),其中 0 二进制数与格雷码的转换公式如下:   G(i) = B(i+1) XOR B(i) ; 0   G(i) = B(i)            ;      i = N - 1 如果是通过编程计算进行变换,就需要使用这个公式逐位的计算; 如果是使用硬件电路进行变换,就可以使用做而论道前面在回答问题时给出

outlier001的博客 3751

二进制的编码

假设有一个只有4位的二进制:0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111,共16个数,来表示-8到7共16个数。 很自然的我们想到用0000-0111来表示0-7. -8到-1该用谁来表示呢,有个原码是用的1000表示-1,1001表-2,等等以此类推,还说是自然顺序。 ...

weixin_30472035的博客 1246

进阶之路——二进制与格雷码的相互转换模块设计

最近在研究异步fifo的同步化设计,里面需要格雷码与二进制码的转换,因此研究了下实现的代码

moon9999的博客 4440

【知识点】二进制和格雷码的互相转化

格雷码,又叫循环二进制码或反射二进制。格雷码的特点是任意两个相邻的代码只有一位二进制数不同。异或运算:相同为 0,相异为 1。

老大小的博客 2087

PCM(脉冲编码调制)的折叠码原理

1、8位PCM的编码规则 四位段内码 A0A1A2A3 (对应16电平) 三位段落码 A4A5A6 (对应8段) 一位极性码 A7 (1=正极性,0=负极性) 2、自然二进制码 (1)自然二进制码与二进制数相对应,完全按照数学中的转码方法来算; (2)自然码是权重码,每位有确定大小,由高位到低位顺序:2^n-1,。。。2,1(n为自然数) (3)可以比较大小和进行算术运算 3、自然二进制码和折叠码区别 (1)、自然码从最低电平(最负)到最正电平; (2)、折叠码是对电平的绝对值进行...

u012980075的博客 8344

格雷码与二进制码的互换

二进制码与格雷码之间的转换

三岁囍的博客 7249
上一篇: 堆排序的JAVA实现及时间复杂度分析
下一篇: 【LeetCode 136 137 260】 只出现一次的数字Ⅰ、Ⅱ、Ⅲ (Single Number)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值