89.格雷编码 python

Python实现n位格雷码序列生成

题目

题目描述

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

示例 1:

输入:n = 2
输出:[0,1,3,2]
解释:
[0,1,3,2] 的二进制表示是 [00,01,11,10] 。

  • 00 和 01 有一位不同
  • 01 和 11 有一位不同
  • 11 和 10 有一位不同
  • 10 和 00 有一位不同
    [0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01] 。
  • 00 和 10 有一位不同
  • 10 和 11 有一位不同
  • 11 和 01 有一位不同
  • 01 和 00 有一位不同

示例 2:

输入:n = 1
输出:[0,1]

提示:

1 <= n <= 16

题解

生成 n 位格雷码序列的一种常用方法是使用反射(或镜像)构造法。这种方法的基本思想是从一个已知的较小位数的格雷码开始,通过反射和前缀添加来构建更大的格雷码。

反射构造法步骤

  1. 初始化:从最简单的格雷码 [0] 开始。
  2. 迭代:对于每一个新的位数 i,基于前一位数的格雷码进行以下操作:
    • 将当前的格雷码列表复制一份,并在前面加上 0(即保持原样)。
    • 然后将该列表反转,并在前面加上 1(即对每个元素加 2 ( i − 1 ) 2^{(i-1)} 2(i1))。
    • 最后,将这两部分合并成新的格雷码列表。

Python 实现代码

以下是使用上述方法生成 n 位格雷码序列的 Python 实现:

def grayCode(n: int) -> list:
    # 初始化格雷码列表为 [0]
    gray = [0]
    
    for i in range(n):
        # 计算新增的前缀值
        prefix = 1 << i
        
        # 反转当前的格雷码列表,并给每个元素加上前缀值
        # 注意这里需要从后往前遍历以实现“反转”
        for j in reversed(gray):
            gray.append(prefix + j)
    
    return gray

提交结果

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值