【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算

news2024/9/28 7:27:00

格雷码

看到题目就想到了格雷码 然后就疯狂搜索格雷码 手动构造了一波格雷码 看了题解 emmm 有点亏

理论基础

  • n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:

    • 每个整数都在范围 [0, 2n - 1] 内(含 02n - 1
    • 第一个整数是 0
    • 一个整数在序列中出现 不超过一次
    • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
    • 第一个最后一个 整数的二进制表示 恰好一位不同
  • 三位二进制数的格雷码序列为
    000 , 001 , 011 , 010 , 110 , 111 , 101 , 100 000,001,011,010,110,111,101,100 000,001,011,010,110,111,101,100

  • 手动构造 k k k位格雷码

    从全 0 0 0格雷码开始,按照下面策略:

    1. 翻转最低位得到下一个格雷码;
    2. 把最右边的 1 1 1的左边的位翻转得到下一个格雷码;

    交替按照上述策略生成 2 k − 1 2^k-1 2k1次,可得到 k k k位的格雷码序列

  • 镜像构造格雷码

    k k k位的格雷码可以从 k − 1 k-1 k1位的格雷码以上下镜射后加上新位的方式快速得到

    image-20230223111139652

  • 公式构造:从0开始构造 k k k位格雷码,第 i i i个格雷码为(下标从0开始)
    g i = i ⊕ ⌊ i 2 ⌋ g_i=i \oplus\lfloor \frac {i}{2} \rfloor gi=i2i
    其实就是将十进制数 [ 0 , 2 k − 1 ] [0,2^k-1] [0,2k1]的二进制形式,转化为格雷码,转化过程为格雷码 = 自然二进制码 ^ 自然二进制码右移一位,右移一位的操作相当于整除2

相关题目

格雷编码【LC89】

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:

  • 每个整数都在范围 [0, 2n - 1] 内(含 02n - 1
  • 第一个整数是 0
  • 一个整数在序列中出现 不超过一次
  • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
  • 第一个最后一个 整数的二进制表示 恰好一位不同

给你一个整数 n ,返回任一有效的 n 位格雷码序列

手动构造

  • 思路:交替手动构造

    从全 0 0 0格雷码开始,按照下面策略:

    1. 翻转最低位得到下一个格雷码;
    2. 把最右边的 1 1 1的左边的位翻转得到下一个格雷码;

    交替按照上述策略生成 2 k − 1 2^k-1 2k1次,可得到 k k k位的格雷码序列

  • 实现

    class Solution {
        public List<Integer> grayCode(int n) {
            List<Integer> res = new ArrayList<>();
            int len = 1 << n;
            res.add(0);
            for (int i = 1; i < len; i++){
                // 交替构造
                if ((i & 1) == 1){
                    // 反转最低位
                    res.add(reverseIth(res.get(i - 1), 0));
                }else{
                    int j = 0, pre = res.get(i - 1);
                    while (((pre >> j) & 1) == 0){
                        j++;
                    }
                    // 反转最右边的1的左边的那位
                    res.add(reverseIth(res.get(i - 1), j + 1));
                }
            }
            return res;
        }
        // 反转右边数第i位
        public int reverseIth(int num, int i){
            if (((num >> i) & 1) == 0){
                return num | (1 << i );// 设为1
            }else{
                return num & (~(1 << i));// 设为0
            }
        }
    }
    
    • 复杂度分析

      • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
      • 空间复杂度: O ( 1 ) O(1) O(1)

镜像构造

  • 思路:

    k k k位的格雷码可以从 k − 1 k-1 k1位的格雷码以上下镜射后加上新位的方式快速得到

  • 实现

    倒序遍历 k − 1 k-1 k1位的格雷码,以此将第 k k k位赋值为1

    class Solution {
        public List<Integer> grayCode(int n) {
            List<Integer> res = new ArrayList<>();
            res.add(0);
            for (int i = 0; i < n; i++){
                int m = res.size();
                for (int j = m - 1; j >= 0; j--){
                    res.add(res.get(j) | (1 << i));
                }
            }
            return res;
        }
    }
    
    • 复杂度分析

      • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
      • 空间复杂度: O ( 1 ) O(1) O(1)

公式构造

  • 实现

    class Solution {
        public List<Integer> grayCode(int n) {
            List<Integer> res = new ArrayList<>();
            for (int i = 0; i < 1 << n; i++){
                res.add(i ^ (i / 2));
            }
            return res;
        }
    }
    
    • 复杂度分析

      • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
      • 空间复杂度: O ( 1 ) O(1) O(1)

循环码排列【LC1238】

给你两个整数 nstart。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p,并且满足:

  • p[0] = start
  • p[i]p[i+1] 的二进制表示形式只有一位不同
  • p[0]p[2^n -1] 的二进制表示形式也只有一位不同

先构造再添加

  • 思路:

    根据题意相邻二进制只有一位不相同,那么可以想到格雷码。可以将start看作某个格雷码的二进制形式,然后可以先按照题格雷编码【LC89】先从0开始构造出 n n n位的格雷码,在构造过程中记录与start相等的格雷码下标 i n d e x index index。最后再从 i n d e x index index遍历一次格雷码数组,将结果添加到结果集中。

  • 实现

    class Solution {
        public List<Integer> circularPermutation(int n, int start) {
            int len = 1 << n;
            int[] gray = new int[len];
            List<Integer> res = new ArrayList<>();
            int index = start;
            for (int i = 0; i < len; i++){
                gray[i] = i ^ (i >> 1);
                if (gray[i] == start) index = i;
            }
            for (int i = index;i < index + len; i++){
                res.add(gray[i % len ]);
            }
            return res;
    
        }
    
    
    }
    
    • 复杂度分析

      • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
      • 空间复杂度: O ( 2 n ) O(2^n) O(2n)

异或start

  • 思路:题格雷编码【LC89】从0开始构造出 n n n位的格雷码,那么我们可以在构造的每个结果上异或start,那么起始数值变为了start,又保证相邻数的二进制形式只有一位不同

    class Solution {
        public List<Integer> circularPermutation(int n, int start) {
            int len = 1 << n;
            List<Integer> res = new ArrayList<>();
            for (int i = 0; i < len; i++){
                res.add(i ^ (i >> 1) ^ start);
            }
            return res;
        }
    
    
    }
    
    • 复杂度分析

      • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
      • 空间复杂度: O ( 1 ) O(1) O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之“制作自定义数据”--torch.utils.data.DataLoader重写构造方法。

深度学习之“制作自定义数据”–torch.utils.data.DataLoader重写构造方法。 前言&#xff1a; ​ 本文讲述重写torch.utils.data.DataLoader类的构造方法&#xff0c;对自定义图片制作类似MNIST数据集格式&#xff08;image, label&#xff09;&#xff0c;用于自己的Pytorc…

大数据Hadoop教程-学习笔记04【数据仓库基础与Apache Hive入门】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程 总时长&#xff1a;14:22:04教程资源: https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【17p】【P018-P037】大…

Spring boot开启定时任务的三种方式(内含源代码+sql文件)

Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09; 源代码sql文件下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09;源代码…

【无人机】回波状态网络(ESN)在固定翼无人机非线性控制中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端常见手写面试题集锦

实现迭代器生成函数 我们说迭代器对象全凭迭代器生成函数帮我们生成。在ES6中&#xff0c;实现一个迭代器生成函数并不是什么难事儿&#xff0c;因为ES6早帮我们考虑好了全套的解决方案&#xff0c;内置了贴心的 生成器 &#xff08;Generator&#xff09;供我们使用&#xff…

java面试题-IO流

基础IO1.如何从数据传输方式理解IO流&#xff1f;IO流根据处理数据的类型可以分为字节流和字符流。字节流字节流以字节&#xff08;8位&#xff09;为单位读写数据。字节流主要用于读写二进制文件&#xff0c;如图片、音频、视频等。Java中的InputStream和OutputStream就是字节…

写论文不用构建语料库!只需要福昕PDF阅读器高级搜索

写论文不用构建语料库&#xff01;只需要福昕PDF阅读器高级搜索 文章目录写论文不用构建语料库&#xff01;只需要福昕PDF阅读器高级搜索前言&#xff1a;“福昕语料库”使用前的准备&#xff1a;调用“语料库”&#xff1a;前言&#xff1a; 最近论文阅读可以借助NewBing的总…

【算法与数据结构(C语言)】栈和队列

文章目录 目录 前言 一、栈 1.栈的概念及结构 2.栈的实现 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 检测栈是否为空&#xff0c;如果为空返回非零结果&#xff0c;如果不为空返回0 销毁栈 二、队列 1.队列的概念及结构 2.队列的实现 初始化队列 队尾入队列 队头出队列 获…

报表开发难上手?这里有一份 Fastreport 最新中文用户指南,请查收

Fast Reports,Inc.成立于1998年&#xff0c;多年来一直致力于开发快速报表软件&#xff0c;包括应用程序、库和插件。FastReport的报表生成器&#xff08;VCL平台和.NET平台&#xff09;、跨平台的多语言脚本引擎FastScript、桌面OLAP FastCube&#xff0c;如今都受到世界各地开…

Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载

Typecho 简介Typecho 是一个简单、强大的轻量级开源博客平台&#xff0c;用于建立个人独立博客。它具有高效的性能&#xff0c;支持多种文件格式&#xff0c;并具有对设备的响应式适配功能。Typecho 相对于其他 CMS 还有一些特殊优势&#xff1a;包括可扩展性、不同数据库之间的…

IDA 实战--(2)熟悉工具

布局介绍 软件启动后会 有几个选项&#xff0c;一般直接选择Go 即可 之后的工作台布局如下 开始分析 分析的第一个&#xff0c;将PE 文件拖入工作区 刚开始接触&#xff0c;我们先保持默认选项&#xff0c;其它选项后面会详细讲解&#xff0c;点击OK 后&#xff0c;等待分析…

软件项目管理知识回顾---软件项目质量和资源管理

软件项目质量和资源管理 5.0质量管理 5.1质量管理模型 1.模型 boehm模型&#xff1a;可移植性&#xff0c;可使用性&#xff0c;可维护性McCall模型ISO体系认证5.2质量成本 1.含义&#xff1a;由于产品第一次不正常运行而产生的附加费用 预防成本和缺陷成本5.3质量管理 1.过程 …

Python opencv进行矩形识别

Python opencv进行矩形识别 图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,4个顶点,如下图: 左边是原始图像,右边是识别结果,在我i5 10400的CPU上,执行时间不到8ms。 识别出结果后,计算任意3个顶点…

【自监督论文阅读笔记】Unsupervised Learning of Dense Visual Representations

Abstract 对比自监督学习已成为无监督视觉表示学习的一种有前途的方法。通常&#xff0c;这些方法学习全局&#xff08;图像级&#xff09;表示&#xff0c;这些表示对于同一图像的不同视图&#xff08;即数据增强的组合&#xff09;是不变的。然而&#xff0c;许多视觉理解任务…

PDF文件怎么转图片格式?转换有技巧

PDF文件有时为了更美观或者更直观的展现出效果&#xff0c;我们会把它转成图片格式&#xff0c;这样不论是归档总结还是存储起来都会更为高效。有没有合适的转换方法呢&#xff1f;这就来给你们罗列几种我个人用过体验还算不错的方式&#xff0c;大家可以拿来参考一下哈。1.用电…

vm 网络配置

点击NAT设置&#xff0c;配置本台虚拟机ip&#xff08;注意网关要在同一个网段&#xff09;&#xff0c;配置对应端口 然后添加映射端口&#xff1a; 然后选择网络适配器 选择vm8网卡 配置网卡静态ip #查看网卡 ip addr #修改网卡配置 cd /etc/sysconfig/network-scripts…

DevData Talks | 对谈谷歌云 DORA 布道师,像谷歌一样度量 DevOps 表现

本期 DevData Talks 我们请到来自 Google Cloud 谷歌云的 DORA 研究团队的嘉宾 Nathen Harvey与 Apache DevLake、CNCF DevStream 的海外社区负责人 Maxim 进行对谈。如果您关注 DevOps 的话&#xff0c;也许对这个团队有所耳闻。 DORA 的全称是 DevOps Research and Assessme…

mysql lesson1

常用命令 1:exit 退出mysql 2&#xff1a;uroot pENTER键&#xff0c;再输入密码&#xff0c;不被别人看见 3&#xff1a;完美卸载&#xff1a;双击安装包&#xff0c;手动删除program file中的mysql,手动删除Programedate里的mysql 4:use mysql 使用数据库 5&#xff1a;…

InstallAware Multi-Platform updated

InstallAware Multi-Platform updated 原生ARM&#xff1a;为您的内置设置、IDE和整个工具链添加了Apple macOS和Linux ARM构建。 本地化&#xff1a;引擎内多语言感知&#xff0c;可再分发工具&#xff0c;具有资产隔离功能&#xff0c;使您的IP保持安全。 模板&#xff1a;将…

通信算法复习题纲

通信算法复习题1、当信源发送信号满足以下哪一项条件时&#xff0c;接收端采用最小距离准则进行判决等价于采用最大后验概率准则进行判决&#xff1f;2、OFDM系统的正交性体现在哪个方面&#xff1f;3、模拟信号数字化过程中&#xff0c;哪一步会引入量化噪声&#xff1f;4、OF…