题目描述
The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]
. Its gray
code sequence is:
00 - 0 01 - 1 11 - 3 10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1]
is also a valid gray code sequence according to the
above definition.
解题思路
将格雷码的二进制表示成十进制。格雷码特征是每两个相邻的码字只有一个比特位是不同的,其余的均相同,这种特征使得格雷码是对称的(镜像特征),就是说又上往下排列的码字,从中间对折,高位相反,低位完全相同。eg
下面我们给出两种算法,第一种就是利用这种对称特征,较为复杂,第二种,利用对称和移位,在之前已经构造的格雷码的基础上,由下往上遍历已经建好的格雷码(假设码有i位),依次增加((1<<i)),并加入到格雷码序列中。相当于设置二进制序列的第i位为1.两种算法的代码如下:00 0111 10
方法一:
vector<int> grayCode(int n) {
if(n==0)
{
vector<int> res(1,0);
return res;
}
if(n==1)
{
vector<int> res(2,0);
res[1]=1;
return res;
}
vector<int> mem(n,0);
vector<vector<int>> mem2;
mem2.push_back(mem);
mem[0]=1;
mem2.push_back(mem);
mem[1]=1;
mem2.push_back(mem);
mem[0]=0;
mem2.push_back(mem);
int lll=(1<<n);
int flag=1;
for (int i=4;i<lll;)
{
int len=mem2.size()-1;
flag++;
for (int j=len;j>=0;j--)
{
vector<int> temp=mem2[j];
i++;
temp[flag]=1;
mem2.push_back(temp);
if (i>=lll)
{
break;
}
}
}
mem.clear();
for (int i=0;i<mem2.size();i++)
{
int temp=0;
for (int j=0;j<n;j++)
{
temp+=mem2[i][j]*pow(2.0,j);
}
mem.push_back(temp);
}
return mem;
}
方法二
vector<int> grayCode1(int n)
{
vector<int> res(1,0);
for (int i=0;i<n;i++)
{
int cur=res.size();
while(cur)
{
cur--;
int num=res[cur];
num+=(1<<i);
res.push_back(num);
}
}
return res;
}