LeetCode 89. 格雷編碼(C、C++、python)
阿新 • • 發佈:2018-11-21
格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。
示例 1:
輸入: 2 輸出:[0,1,3,2]
解釋: 00 - 0 01 - 1 11 - 3 10 - 2 對於給定的 n,其格雷編碼序列並不唯一。 例如,[0,2,3,1]
也是一個有效的格雷編碼序列。 00 - 0 10 - 2 11 - 3 01 - 1
示例 2:
輸入: 0 輸出:[0] 解釋: 我們定義
格雷編碼序列必須以 0 開頭。給定
編碼總位數為n 的格雷編碼序列,其長度為 2n
。當 n = 0 時,長度為 20 = 1。 因此,當 n = 0 時,其格雷編碼序列為 [0]。
思路: n=0,0 n=1, 0 1
n=2,00
01
11
10
n=3,000
001
011
010
110
111
101
100
可以發現,n+1時,只要把數字翻轉過來,最高位置為1即可滿足條件,程式碼如下:
C
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* grayCode(int n, int* returnSize)
{
int count=pow(2,n);
int* res=(int*)malloc(sizeof(int)*count);
res[0]=0;
int k=1;
if(n>0)
{
res[1]=1;
k=2;
int i=2;
while(i<=n)
{
int m=k;
int cc=pow(2,i-1);
for(int j=0;j<m;j++)
{
res[k++]=cc+res[m-1-j];
}
i++;
}
}
*returnSize=k;
return res;
}
C++
class Solution {
public:
vector<int> grayCode(int n)
{
vector<int> res;
if(0==n)
{
res.push_back(0);
}
else
{
res.push_back(0);
res.push_back(1);
int i=2;
while(i<=n)
{
int m=res.size();
int cc=pow(2,i-1);
for(int j=0;j<m;j++)
{
res.push_back(cc+res[m-1-j]);
}
i++;
}
}
return res;
}
};
python
class Solution:
def grayCode(self, n):
"""
:type n: int
:rtype: List[int]
"""
res=[0]
if n>0:
res.append(1)
i=2
while i<=n:
m=len(res)
cc=2**(i-1)
for j in range(m):
res.append(cc+res[m-1-j])
i+=1
return res