LeetCode89-格雷编码

哇,早上起来一看CCF的分数

心情立马由开心跌倒了谷底

什么操蛋的玩意儿

我只有190分

LeetCode89-格雷编码

我不信我不信我不信

牢骚过后还是得老老实实干活儿!

今天一定要买块蛋糕安慰自己


89-格雷编码

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。

示例 1:

输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2

对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。

00 - 0
10 - 2
11 - 3
01 - 1

示例 2:

输入: 0
输出: [0]
解释: 我们定义格雷编码序列必须以 0 开头。
     给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。
     因此,当 n = 0 时,其格雷编码序列为 [0]。

思路:

这一题刚开始也是没点头绪,后来看了一些大佬的讲解,才想到将这个格雷编码与二进制编码联系在一起。因为题目给了一个提示:给定编码总位数为 n 的格雷编码序列,其长度为 2^n。这不就跟告诉你二进制的位数,你可以得到二进制的组成情况类似吗?因为当二进制位数为n时,其可以组成2^n个数。所以我们完全可以将其联系在一起。如下图所示:

LeetCode89-格雷编码

 

给定一个整数,我们可以很快求得其二进制表示,但是如何从二进制转化为格雷编码呢?这儿就得用到异或操作了。我直接把公式写出来吧,假设一二进制表示为a,则其格雷编码为b = int(a, 2)^(a>>1) 其中int(a, 2)表示二进制a的十进制数;a>>1表示将二进制a左移一位。写到这儿题目立马就可以解出来了。

代码如下:

class Solution(object):
    # 核心点:将格雷编码与二进制编码联系起来
    def grayCode(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        gray_list = []
        for index in range(2**n):
            left_index = index >> 1
            gray = index ^ left_index
            gray_list.append(gray)
        return gray_list


if __name__ == "__main__":
    n = 0
    gray_list = Solution().grayCode(n)
    print(gray_list)

不过执行效率也是颇低,只有10%左右。有点想不懂!

LeetCode89-格雷编码