leetcode89 格雷編碼

2021-10-05 05:04:53 字數 1263 閱讀 1973

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。

給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。

示例 1:

輸入:

2輸出:[0

,1,3

,2]解釋:00-

001-1

11-310

-2

對於給定的 n,其格雷編碼序列並不唯一。

例如,[0,2,3,1] 也是乙個有效的格雷編碼序列。

00-0

10-211

-301-

1

示例 2:

輸入:

0輸出:[0

]解釋: 我們定義格雷編碼序列必須以 0 開頭。

給定編碼總位數為 n 的格雷編碼序列,其長度為 2n。當 n =

0 時,長度為 20=1。

因此,當 n =

0 時,其格雷編碼序列為 [

0]。

假設我們要求n=3時的格雷編碼。

已知n=2時,格雷編碼的二進位制位a = [000, 001, 011, 010],我們將a翻轉後得到b = [010, 011, 001, 000]。

不難看出,a是n=2時的格雷編碼,因此a滿足格雷編碼的條件,即相鄰的數字之間的二進位制僅有一位不同。另一方面,b是a翻轉之後得到的,因此b也滿足格雷編碼的條件。且a的最後乙個元素與b的第乙個元素相同。

因此,為了使b的第乙個元素和a的最後乙個元素之間滿足格雷編碼的要求,只要讓b的某一位變動即可(0->1 or 1->0)。但是如果b的第乙個元素發生改變,可能會打亂b中的格雷編碼。為了在b的第乙個元素發生改變時,b中的所有元素仍然滿足格雷編碼條件,應該找到b中所有元素均相同的一位,改變該位置上的數字即可。因此,應該變動b的最高位,

即b變為[110, 111, 101, 100]。

總結上述規律可以發現,當我們有了n=m-1的格雷編碼結果a時,將a逆轉得到b,且b中所有元素在從右往左數的第m位均相同(0),因此下一次變動時,僅改變b中每個數字的第m位即可。

class

solution

; vector<

int> res;

rec.

push_back(0

);int curnum =1;

while

(n >0)

return res;}}

;

Leetcode 89 格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0,...

LeetCode89 格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,...

leetcode 89 格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0...