哇,早上起来一看CCF的分数
心情立马由开心跌倒了谷底
什么操蛋的玩意儿
我只有190分
我不信我不信我不信
哎
牢骚过后还是得老老实实干活儿!
今天一定要买块蛋糕安慰自己
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个数。所以我们完全可以将其联系在一起。如下图所示:
给定一个整数,我们可以很快求得其二进制表示,但是如何从二进制转化为格雷编码呢?这儿就得用到异或操作了。我直接把公式写出来吧,假设一二进制表示为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%左右。有点想不懂!