问题描述
思路与代码
格雷编码的要点:
- 第一个数是 0
- 每次只改变一位二进制编码
- 第一个(0)和最后一个数的二进制编码只有一位差异
本文提供两种方法。
镜像反射法
题解中给出了一种镜像反射法,很巧妙。该方法的思路,每增加一阶时,只需要将上一阶的格雷码倒序排列,在每个编码最前面增加一个 1,然后拼接到上一阶的格雷码序列即可。
代码如下:
class Solution:
def grayCode(self, n: int) -> List[int]:
res, head = [0], 1 # intialise
for i in range(n):
for j in range(len(res) - 1, -1, -1): # inverted order traversal
res.append(head + res[j]) # concat
head <<= 1
return res
运行效果:
右移异或法
格雷编码的一种经典的迭代方式是,每次变化尽可能低的位,前面的镜像反射法也是这样的流程。另一种实现方式是,对前一个格雷编码右移一位,然后与之进行按位亦或,所得结果即为下一个格雷编码。
这种方法也很巧妙,但具体原理笔者尚未理解。
代码如下:
class Solution:
def grayCode(self, n: int) -> List[int]:
list_res = []
for i in range(1 << n):
list_res.append(i ^ (i >> 1))
return list_res
运行效果: