23.2.23每日一题-格雷码+例题(py3)

格雷码+例题(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)

  • 1238. 循环码排列

  • 题目大意:
    给你两个整数 n 和 start。你的任务是返回任意 ( 0 , 1 , 2 , , . . . , 2 n − 1 ) (0,1,2,,...,2^n-1) (0,1,2,,...,2n1) 的排列 p,并且满足:

    • p[0] = start
    • p[i] 和 p[i+1] 的二进制表示形式只有一位不同
    • p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同
      注意:(1) 1 ≤ n ≤ 16 1 \le n \le 16 1n16;(2) 0 ≤ s t a r t < 2 n 0 \le start < 2^n 0start<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)]

猜你喜欢

转载自blog.csdn.net/weixin_42269028/article/details/129181426