swift演算法 格雷編碼

2021-09-24 21:53:49 字數 1571 閱讀 5944

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,...