【python高效解題】Leetcode-89:格雷編碼
阿新 • • 發佈:2021-01-20
我們的宗旨是:使用最簡潔的程式碼,完成AC:)
題目介紹
格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數 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]。
題目分析
格雷碼類的題考查的是計算機二進位制編碼的基礎,如,十進位制轉換為二進位制,二進位制的反碼,二進位制的補碼等。
格雷編碼可以通過迭代生成,迭代公式為 result[i+1] = result[i] ^ x[i], x[i]可以由i運算得到,x[i] = i & -i
result | x[i] | i |
---|---|---|
000 | 001 | 001(1) |
001 | 010 | 010(2) |
011 | 001 | 011(3) |
010 | 100 | 100(4) |
110 | 001 | 101(5) |
111 | 010 | 110(6) |
101 | 001 | 111(7) |
100 |
python程式碼
class Solution:
def grayCode(self, n: int) -> List[int]:
res = [0]
for i in range(1, 2**n):
res.append(res[-1] ^ (i & -i))
return res