一、題目
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