题目
题目描述
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 位格雷码序列的一种常用方法是使用反射(或镜像)构造法。这种方法的基本思想是从一个已知的较小位数的格雷码开始,通过反射和前缀添加来构建更大的格雷码。
反射构造法步骤
- 初始化:从最简单的格雷码
[0]开始。 - 迭代:对于每一个新的位数
i,基于前一位数的格雷码进行以下操作:- 将当前的格雷码列表复制一份,并在前面加上
0(即保持原样)。 - 然后将该列表反转,并在前面加上
1(即对每个元素加 2 ( i − 1 ) 2^{(i-1)} 2(i−1))。 - 最后,将这两部分合并成新的格雷码列表。
- 将当前的格雷码列表复制一份,并在前面加上
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
提交结果

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

被折叠的 条评论
为什么被折叠?



