文章目录
格雷码+例题(py3)
格雷码(知识点)
-可以直接查看LC的例题,很详细!这是链接:89. 格雷编码具体含义如下:
- n 位格雷码序列是一个由 2n 个整数组成的序列,其中:
1.每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1);
2.第一个整数是 0;
3.一个整数在序列中出现不超过一次;
4.每对相邻整数的二进制表示恰好一位不同 ;
5.第一个和 最后一个 整数的二进制表示恰好一位不同。
编码就是一行(py3):[i^(i>>1) for i in range(1<<n)]
例题(py3)
-
题目大意:
给你两个整数 n 和 start。你的任务是返回任意 ( 0 , 1 , 2 , , . . . , 2 n − 1 ) (0,1,2,,...,2^n-1) (0,1,2,,...,2n−1) 的排列 p,并且满足:- p[0] = start
- p[i] 和 p[i+1] 的二进制表示形式只有一位不同
- p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同
注意:(1) 1 ≤ n ≤ 16 1 \le n \le 16 1≤n≤16;(2) 0 ≤ s t a r t < 2 n 0 \le start < 2^n 0≤start<2n;
-
示例:
输入:n = 2, start = 3
输出:[3,2,0,1]
解释:这个排列的二进制表示是 (11,10,00,01)
所有的相邻元素都有一位是不同的,另一个有效的排列是 [3,1,0,2]
输出:n = 3, start = 2
输出:[2,6,7,5,4,0,1,3]
解释:这个排列的二进制表示是 (010,110,111,101,100,000,001,011)
- 参考代码:
class Solution:
def circularPermutation(self, n: int, start: int) -> List[int]:
# 方法一 找出格雷编码序列后重新按要求进行调序
g = [i^(i>>1) for i in range(1<<n)]
t = g.index(start)
return g[t:]+g[:t]
# 方法二 直接与start异或
# return [i^(i>>1)^start for i in range(1<<n)]