举报了,本来写的好好的,突然没了,什么辣鸡编译器。
今天这个题目不太好懂,看了好几个blog我才看懂是什么,我先来解释一下
关键在于多读几遍这个句,格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
首先题目给的n是指二进制数的位数
比如说
n = 0 对应 None
n = 1 对应 0 1
n = 2 对应 00 01 11 10
n = 3 对应 000 001 011 010 110 111 101 100
也就是二进制数里面有多少个01组成由n决定
而两个连续的数值仅有一个位数的差异的意思是
比如 n = 3 的情况
000-001 只在第三位不同,一个是0,一个是1
001-011 只在第二位不同,一个是0,一个是1
…
101-100 只在第三位不同,一个是1,一个是0
OK这样我们就把题目读懂了。
n = 0 对应 None
n = 1 对应 0 1
n = 2 对应 00 01 11 10
n = 3 对应 000 001 011 010 110 111 101 100
我们可以看到这样一个规律
n = 2时,只需要把n = 1时的0 1镜像反射形成0 1 | 1 0,然后在镜像形成的那部分的数的前面添上1就可以了,也就是0 1 | 11 10,为了保持位数相同给左边的数添零,变成 00 01 | 11 10
这个过程如果用编程的语言来实现,可以这样
用这两个操作就可以
<< 左移符号,即在二进制表示后加一位 0,比如1<<1 = 2 (1->10=2)
x | 1<<n-1 就是在十进制数字 x 的二进制前面加一位1之后的十进制结果,因为n是位数,n -1 即为1后面添0的个数,比如 x = 1,有 1 | 10 = 11 (01和10对应位数的位置有1,结果就为1,01|10 = 11)
class Solution:
def grayCode(self, n: int) -> List[int]:
result = [0]
for i in range(n):
result.extend([x|1<<i for x in result[::-1]])
return result
这里貌似只能用extend,不能用append,append里面的括号貌似不能用for