1. 程式人生 > >Leetcode 89:格雷編碼(超詳細的解法!!!)

Leetcode 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位二進位制的數,從右到左按照0n-1編號,一個n位普通二進位制碼記為 B n 1 . .

. B 1 B 0 B_{n-1}...B_{1}B_{0} ,對應的格雷碼記為 G
n 1 . . . G 1 G 0 G_{n-1}...G_1G_0
。其中的轉換關係可以表示為

  • G n 1 = B n 1 G_{n-1}=B_{n-1}
  • G i = B i B i + 1 , 0 i n 2 G_i=B_i \oplus B_{i+1},0\leq i\leq n-2

也就是 i i > > 1 i \oplus i>>1

class Solution:
    def grayCode(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        if n == 0:
            return [0]
        
        res = list()
        for i in range(1 << n):
            res.append(i ^ (i>>1))
        return res

reference:

https://zhuanlan.zhihu.com/p/29254973

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!