[LeetCode By Python] 89. Gray Code

一、題目

Gray Code

二、解題

Gray Code:格雷碼

題目的意思是在給出一個字節長度n,生成一個序列,這個序列的要求是格雷碼(每連續的兩個數的二進制只能有一位的不同,例如000 和 010只有第二位1不同)。

三、獨立思考

1)判斷前后兩個二進制數是否滿足格雷碼條件?
首先想到的就是對兩個數進行一次異或(^),然后把得到的值通過divmod 進行除2求余,如果余數值為1的個數只有1個,則滿足條件,反之不滿足。
2)怎么遍歷字節長為n的所有數?
使用sourceCodeList列表初始化儲存0~2^n的數字,從第一個0開始,每次遍歷這個列表里面從小到大找下一個數字,滿足則保存到resultCodeList里面,然后從sourceCodeList刪除該數字。(這樣考慮的是隨著數字找出的越多,sourceCodeList越少,就越來越快)
3)怎么確定邊界
存在兩個邊界:

  • sourceCodeList為空,即遍歷完了
  • sourceCodeList不為空,找不到下一個了。

四、嘗試與結果

#!/usr/bin/python
#coding:utf-8

class Solution(object):
    def isGrayCode(self,x,y):
        count = 0
        tBin = x^y
        while (tBin != 0):
            tBin,mod = divmod(tBin,2)
            if mod == 1:
                count += 1

        if (count ==1):
            return True
        else:
            return False

    def grayCode(self, numLen):
        sourceCodeList = []
        for i in range(0,2 ** numLen):
            sourceCodeList.append(i)
        resultCodeList = [0]
        sourceCodeList.remove(0)

        while True:
            for i in sourceCodeList:
                if i not in resultCodeList:
                    if (self.isGrayCode(resultCodeList[-1],i)):
                        resultCodeList.append(i)
                        sourceCodeList.remove(i)
                        break
            if (len(sourceCodeList) <= 0):
                break
            if (i == sourceCodeList[-1]):
                break
        return resultCodeList

if __name__ == '__main__':
    print Solution().grayCode(11)

結果n=11到時候開始TL,自己嘗試了一下,在5s左右

n=11

四、學習與記錄

1)解決方法:按照格雷碼的定義
從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應格雷碼該位的值,最左邊一位不變(相當于左邊是0)。

格雷碼的是特點是:
相鄰兩數的格雷碼,僅僅有一位二進制發生變化。
而且在其范圍內的最小值和最大值,也僅僅有一位二進制發生變化。
例如下面兩數:
最小:二進制0000=格雷碼0000
最大:二進制1111=格雷碼1000

那基本上就是右移然后異或就可以了

    def grayCode(self,numLen):
        resultCodeList = []
        for i in range(0,2 ** numLen):
            grayCode = (i >> 1)^i
            resultCodeList.append(grayCode)
        return resultCodeList
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容