当前位置: 首页 > news >正文

LeetCode 格雷编码问题

格雷编码

    • 格雷编码的定义
    • 格雷编码的码表
    • LeetCode 89. 格雷编码
      • 实例
      • 思路与代码
        • 思路一:找规律
          • 代码一
          • 代码二
        • 思路二:与自然数之间的关系(你必须知道,这个规律要去百度才知道)
          • 代码一
    • LeetCode 1238. 循环码排列
      • 实例
      • 思路与代码
        • 思路一:找规律
        • 代码一
        • 思路二:与自然数之间的关系
        • 代码一:

格雷编码的定义

格雷编码我们在大学时期已经了解过了,在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。 [2] 在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。格雷码有多种编码形式。
格雷码(Gray code)曾用过Grey Code、葛莱码、葛兰码、格莱码、戈莱码、循环码、二进制反射码、最小差错码等名字,它们有的是错误的,有的易与其它名称混淆,建议不再使用它们。

格雷编码的码表

自然数自然数的二进制一位格雷码二位格雷码三位格雷码四位格雷码
000000000000000
100011010010001
20010110110011
30011100100010
401001100110
501011110111
601101010101
701111000100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

LeetCode 89. 格雷编码

LeetCode 89. 格雷编码
n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:
每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)
第一个整数是 0
一个整数在序列中出现 不超过一次
每对 相邻 整数的二进制表示 恰好一位不同 ,且
第一个 和 最后一个 整数的二进制表示 恰好一位不同
给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

实例

输入:n = 2
输出:[0,1,3,2]
解释:
[0,1,3,2] 的二进制表示是 [00,01,11,10]- 0001 有一位不同
- 0111 有一位不同
- 1110 有一位不同
- 1000 有一位不同
[0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01]- 0010 有一位不同
- 1011 有一位不同
- 1101 有一位不同
- 0100 有一位不同

思路与代码

思路一:找规律

观察格雷码的规律,具有一定的对称性,高位是 1 或者 0,并由此就行对称

代码一
//耗时 6ms
class Solution {public List<Integer> grayCode(int n) {int count = 1;List<Integer> res = new ArrayList<>();res.add(0);res.add(1);while (n-- > 1) {count <<= 1;for (int i = count - 1; i >= 0; i--) {res.add(res.get(i) + count);}}return res;}
}

因为res.get(i)是循环方式去取值,当n的位数确定后格雷数就已经知道多少了,故可以这样写

代码二
class Solution {public List<Integer> grayCode(int n) {Integer[] res = new Integer[1 << n];res[0] = 0;res[1] = 1;int count = 1;while (n-- > 1) {count <<= 1;for (int i = 0; i < count; i++) {res[i + count] = count + res[count - i - 1];}}return Arrays.asList(res);}
}

思路二:与自然数之间的关系(你必须知道,这个规律要去百度才知道)

格雷码→二进制码(解码):
从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。依次异或,直到最低位。依次异或转换后的值(二进制数)就是格雷码转换后二进制码的值。

代码一
class Solution {public List<Integer> grayCode(int n) {List<Integer> res = new ArrayList<>();int sum = 1<<n;for(int i = 0;i < sum;i++){res.add((i >> 1) ^ i);}return res;}
}

LeetCode 1238. 循环码排列

LeetCode 1238. 循环码排列
给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,…,2^n-1) 的排列 p,并且满足:
p[0] = start
p[i] 和 p[i+1] 的二进制表示形式只有一位不同
p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同
实例:

实例

输入:n = 2, start = 3
输出:[3,2,0,1]
解释:这个排列的二进制表示是 (11,10,00,01)所有的相邻元素都有一位是不同的,另一个有效的排列是 [3,1,0,2]

思路与代码

题目与上面的是一样的,所有解决方法也是两种

思路一:找规律

观察格雷码的规律,具有一定的对称性,高位是 1 或者 0,并由此就行对称

代码一

class Solution {public List<Integer> circularPermutation(int n, int start) {List<Integer> ans = new ArrayList<>();Integer[] res = new Integer[1 << n];res[0] = 0;res[1] = 1;int count = 1;int index = start; // 找到位置, 存在start 为 0,1的问题,故直接赋值过去while (n-- > 1) {count <<= 1;for (int i = 0; i < count; i++) {res[i + count] = count + res[count - i - 1];if (res[i + count] == start) {index = i + count;}}}for (int i = 0; i < res.length; i++) {ans.add(res[(index + i) % res.length]);}return ans;}
}

思路二:与自然数之间的关系

要通过观察,格雷数的 ^ 关系,格雷是从0开始的,0^任意数都是本身,然后格雷数每个与前一个变化相差为一,故一直第一个数 ^ 结果就是你想要的

代码一:

class Solution {public List<Integer> circularPermutation(int n, int start) {List<Integer> res = new ArrayList<>();int sum = 1<<n;for(int i = 0;i < sum;i++){res.add((i >> 1) ^ i ^ start);}return res;}
}

相关文章:

LeetCode 格雷编码问题

格雷编码格雷编码的定义格雷编码的码表LeetCode 89. 格雷编码实例思路与代码思路一&#xff1a;找规律代码一代码二思路二&#xff1a;与自然数之间的关系&#xff08;你必须知道&#xff0c;这个规律要去百度才知道&#xff09;代码一LeetCode 1238. 循环码排列实例思路与代码…...

java生成html文件输出到指定位置

String fileName "filename.html";StringBuilder sb new StringBuilder();// 使用StringBuilder 构建HTML文件sb.append("<html>\n");sb.append("<head>\n");sb.append("<title>HTML File</title>\n");sb.a…...

华为OD机试用Python实现 -【微服务的集成测试】(2023-Q1 新题)

华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 微服务的集成测试…...

软考高级信息系统项目管理(高项)原创论文——整体管理(2)

<...

js版 力扣 62. 不同路径

一、题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1…...

Qt音视频开发16-通用悬浮按钮工具栏的设计

一、前言 通用悬浮按钮工具栏这个功能经过了好几个版本的迭代&#xff0c;一开始设计的时候是写在视频控件widget窗体中&#xff0c;当时功能简单就放一排按钮在顶部悬浮widget中就好&#xff0c;随着用户需求的变化&#xff0c;用户需要自定义悬浮条的要求越发强烈&#xff0…...

商品比价API使用说明

商品数据分析 国内最早的比价搜索平台&#xff0c;专注于电商大数据的分析&#xff0c;有10年技术和数据沉淀。 公司自主研发的爬虫、搜索引擎、分布式计算等技术&#xff0c; 实现了对海量电商数据的及时监测、清洗和统计。 数据丰富 详细使用api 数据采集维度&#xff…...

基于 TensorFlow 的植物识别教程

首先&#xff0c;需要准备一些训练数据集。这些数据集应该包含两个文件夹&#xff1a;一个用于训练数据&#xff0c;另一个用于测试数据。每个文件夹应该包含子文件夹&#xff0c;每个子文件夹对应一个植物的种类&#xff0c;并包含该植物的图像。接下来&#xff0c;我们需要使…...

渗透测试之主机探测存活性实验

渗透测试之主机探测存活性实验实验目的一、实验原理1.1 TCP/IP协议1. TCP2. IP1.2 Ping的原理二、实验环境2.1 操作机器2.2 实验工具三、实验步骤1. 学会使用ping命令2. 使用Nmap进行多种方式的探测总结实验目的 熟悉TCP/IP协议、Ping命令基本概念学习nmap、SuperScan扫描方式…...

好用的idea插件leetcode editor【详细安装指南】

如果你和我一样存在着如下困扰&#xff1a; 上班想摸鱼刷leetcode&#xff0c;但是直接打开leetcode界面太扎眼了或者为leetcode刷题不可以debug而发愁 那今天分享的一款IDEA插件可以统统解决上述问题&#xff0c;插件名字叫leetcode editor&#xff0c;你可以直接在plugins中…...

二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

2022年七月七日&#xff0c;工业和信息化部、发展改革委、生态环境部关于印发工业领域碳达峰实施方案的通知落地。全国各省份积极响应&#xff0c;纷纷出台地方指导文件&#xff0c;标志着我国碳减排事业的全面铺开。二氧化碳地质封存技术作为实现我国“双碳”目标的重要一环&a…...

STM32开发(12)----CubeMX配置WWDG

CubeMX配置窗口看门狗&#xff08;WWDG&#xff09;前言一、窗口看门狗的介绍二、实验过程1.STM32CubeMX配置窗口看门狗2.代码实现3.硬件连接4.实验结果总结前言 本章介绍使用STM32CubeMX对窗口看门狗定时器进行配置的方法。门狗本质上是一个定时器&#xff0c;提供了更高的安…...

JVM18运行时参数

4. JVM 运行时参数 4.1. JVM 参数选项 官网地址&#xff1a;https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html 4.1.1. 类型一&#xff1a;标准参数选项 > java -help 用法: java [-options] class [args...](执行类)或 java [-options] -jar …...

Cesium集成WebXR_连接VR设备

Cesium集成WebXR 文章目录Cesium集成WebXR1. 需求2. 技术基础2.1 WebGL2.2 WebXR2.3 其他3. 示例代码4. 效果图5. 参考链接1. 需求 通过WebXR接口&#xff0c;将浏览器端连接到VR头盔&#xff0c;实现在VR头盔中浏览Cesium场景&#xff0c;并可将头盔旋转的操作同步映射为场景…...

物联网在物流行业中的应用

物流管理需要同时监控供应链、仓储、运输等多项活动&#xff0c;然而许多因素会影响物流流程本身并导致延迟。为了简化流程和提高客户满意度&#xff0c;一些行业领导者和决策者积极创新&#xff0c;不断评估并使用物联网对物流流程的成本效益进行深入优化。在本文中&#xff0…...

<c++> 类与对象 | 面向对象 | 访问说明符 | 类的声明 | 创建类

文章目录前言面向过程编程面向对象编程什么是类类和结构体有什么区别三个访问说明符如何创建一个类类的声明创建类申明和定义全部放在类中声明和定义分离前言 从这里我们正式开始学习c中的面向对象编程&#xff0c;在学习之前&#xff0c;我们有必要了解一下什么是面向对象编程…...

恭喜!龙蜥社区荣登 2022 科创中国“开源创新榜”

2 月 20 日&#xff0c;中国科协召开以“创新提振发展信心&#xff0c;科技激发产业活力”为主题的2023“科创中国”年度会议。会上&#xff0c;“科创中国”联合体理事长、中国工程院院士周济介绍了 2022 年系列榜单征集遴选情况&#xff0c;并与中国科协副主席、中国工程院院…...

2023双非计算机硕士应战秋招算法岗之机器学习基础知识

目录 特征工程 2 缺失值处理 15 评价指标 33 逻辑回归 37 决策树 40 随机森林 46 SVM 49 Knn 56 Kmeans 59 PCA 66 朴素贝叶斯 68 常见分类算法的优缺点 72 特征工程 1.什么是特征工程 有这么一句话在业界广泛流传&#xff0c;数据和特征决定了机器学习的上限&#xff0c;而模型…...

二、TS的基础类型、类型注解

TS的基础类型、类型注解 TS的基础类型 js的数据类型&#xff1a; 基础数据类型&#xff08;7个&#xff09; boolean string number null undefined BigInt Symbol 引用数据类型&#xff08;1个&#xff09; Object 变量后面多了一个注解&#xff0c;注解为变量限定数据类型&…...

3年经验,3轮技术面+1轮HR面,拿下字节30k*16薪offer,这些自动化测试面试题值得大家借鉴

面试一般分为技术面和hr面&#xff0c;形式的话很少有群面&#xff0c;少部分企业可能会有一个交叉面&#xff0c;不过总的来说&#xff0c;技术面基本就是考察你的专业技术水平的&#xff0c;hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求&#xff0c;一般来…...

IPFS去中心化存储实战指南:黑马程序员音乐播放器项目开发完整教程

IPFS去中心化存储实战指南&#xff1a;黑马程序员音乐播放器项目开发完整教程 【免费下载链接】BlockChain 黑马程序员 120天全栈区块链开发 开源教程 项目地址: https://gitcode.com/gh_mirrors/blockchain95/BlockChain 你是否想过如何构建一个真正去中心化的音乐播放…...

DMA-330地址空间限制与扩展方案解析

1. DMA-330地址空间限制解析DMA-330作为Arm CoreLink系列中的直接内存访问控制器&#xff0c;其物理寻址能力直接由AxADDR信号宽度决定。这个32位地址总线宽度意味着它原生仅支持4GB&#xff08;2^32字节&#xff09;的物理地址空间访问。在实际嵌入式系统设计中&#xff0c;这…...

适合地产人用的中介房源管理系统

在房产经纪行业&#xff0c;房源管理与客源管理是经纪人日常工作的核心&#xff0c;直接影响业务效率与成交转化。选择一套适配行业需求的中介房源管理系统&#xff0c;能帮助中介团队规范流程、降低运营成本、大幅提升业绩。今天我们以客观视角&#xff0c;详细解析全房源系统…...

全链路压测实战:双十一级别的流量,我是这样扛住的

作为一名在质量保障领域摸爬滚打多年的测试工程师&#xff0c;我深知传统的单接口压测在如今分布式架构下的无力感。当业务流量达到双十一这种脉冲式、高并发的级别时&#xff0c;任何一个非核心链路上的“短板”都可能引发系统性的雪崩。全链路压测不再是选择题&#xff0c;而…...

美团外卖mtgsig与waimai_sign双层签名逆向解析

1. 这不是“爬虫教程”&#xff0c;而是一份反向工程现场笔记你搜到这篇内容&#xff0c;大概率正卡在某个调试窗口前&#xff1a;抓包看到mtgsig和waimai_sign两个参数像两堵墙&#xff0c;无论怎么改请求头、换UA、清缓存&#xff0c;返回永远是{"code":403,"…...

从CTF题看RSA安全:为什么你的密钥不能‘共享素数’?

从CTF实战看RSA密钥安全&#xff1a;那些年我们踩过的坑 在网络安全竞赛和实际渗透测试中&#xff0c;RSA算法的错误实现方式往往成为突破的关键点。本文将通过典型CTF赛题案例&#xff0c;揭示五种常见RSA实现漏洞背后的数学原理和安全启示&#xff0c;帮助开发者在实际项目中…...

CentOS服务器上VNC连接失败?手把手教你排查并修复个人端口问题(附重启命令)

CentOS服务器VNC连接故障深度排查指南&#xff1a;从原理到实战当你在深夜赶项目时&#xff0c;突然发现VNC连接不上服务器&#xff0c;那种焦虑感我深有体会。去年参与半导体器件仿真项目时&#xff0c;我也曾被这个问题困扰整整两天。本文将分享一套经过实战检验的排查方法论…...

为什么鸿蒙 App 最终都会走向状态驱动?

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...

百度文心一言开发者如何通过Taotoken低成本接入多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心一言开发者如何通过Taotoken低成本接入多模型API 对于已经熟悉并正在使用百度文心一言等国产大模型API的开发者而言&#…...

基于随机森林的低成本传感器机器学习校准实践指南

1. 项目概述&#xff1a;当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天&#xff0c;低成本传感器几乎无处不在。从监测办公室的空气质量&#xff0c;到追踪城市街道的噪音污染&#xff0c;再到农业大棚里的温湿度控制&#xff0c;这些价格亲民的“小眼睛…...