1、描述
格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。
給定乙個代表編碼總位數的非負整數n,列印其格雷編碼序列,格雷編碼序列必須以0開頭。
例1:輸入:2
輸出:[0, 1, 3, 2]
解釋:對於給定的n,其格雷編碼序列並不唯一,[0, 2, 3, 1]也是乙個有效的格雷編碼序列
00 - 0
01 - 1
11 - 3
10 - 2
例2:輸入:0
輸出:[0]
解釋:我們定義格雷編碼序列必須以0開頭,給定的編碼總位數為n的格雷編碼序列,其長度為 2^n。當 n = 0 時,長度為2^0 = 1。因此,當n=0時,其格雷編碼序列為[0]。
2、演算法
解法一:鏡射排列/動態規劃
思想:大問題轉化成小問題求解
如果知道了 n = 2 的解的話,如果是 ,那麼 n = 3 的解就是 ,即 。之前的解直接照搬過來,然後倒序把每個數加上 1 << ( n - 1) 新增到結果中即可。
時間複雜度::o(2^n)
func graycode(_ n: int) -> [int]
}return gray
}
解法二:直接排列/直接推導
思想:
生成格雷碼的思路:以二進位制為 0 值的格雷碼為第零項,第一項改變最右邊的位元,第二項改變右起第乙個為1的位元的左邊位元,第
三、四項方法同第
一、二項,如此反覆,即可排列出n個位元的格雷碼。
以 n = 3 為例。
0 0 0 第零項初始化為 0。
0 0 1 第一項改變上一項最右邊的位元
0 1 1 第二項改變上一項右起第乙個為 1 的位元的左邊位
0 1 0 第三項同第一項,改變上一項最右邊的位元
1 1 0 第四項同第二項,改變最上一項右起第乙個為 1 的位元的左邊位
1 1 1 第五項同第一項,改變上一項最右邊的位元
1 0 1 第六項同第二項,改變最上一項右起第乙個為 1 的位元的左邊位
1 0 0 第七項同第一項,改變上一項最右邊的位元
時間複雜度: 由於每新增兩個數需要找第乙個為 1 的位元,需要 o(n),o(n2^n)
func graycode(_ n: int) -> [int] else
}i += 1
}return gray
}
解法三:公式/二進位制轉格雷編碼
思想:二進位制轉格雷碼 g(n)=b(n+1) xor b(n)
利用公式轉換即可。即最高位保留,其它位是當前位和它的高一位進行異或操作。
時間複雜度:o(2^n)
func graycode(_ n: int) -> [int]
return gray
}
演算法 格雷編碼
二進位制的練習掌握 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。要求 給乙個n,構建對應的格雷編碼 舉例 輸入 2輸出 0 1,3 2 解釋 00 001 1 11 310 2思路 觀察案例得知,格雷編碼是連續的二進位制數。規則有兩條 1,n 2,就是兩位二進位制,...
89 格雷編碼
格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,...
leetcode 格雷編碼
題目 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0,...