problem:
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.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
Backtrackingthinking:
(1)严格按照格雷码定义来,格雷码有一个递推公式:
利用上述公式可以递推(回溯)出N位格雷码,我这里采用字符串的处理方式实现上述公式,原理一样。
code:
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ret;
if(n==0)
{
ret.push_back(0);
return ret;
}
if(n==1)
{
ret.push_back(0);
ret.push_back(1);
return ret;
}
if(n==2)
{
ret.push_back(0);
ret.push_back(1);
ret.push_back(3);
ret.push_back(2);
return ret;
}
vector<string> gc2;
gc2.push_back(string("00"));
gc2.push_back(string("01"));
gc2.push_back(string("11"));
gc2.push_back(string("10"));
vector<string> gc(gc2);
int length=4;
for(int i=3;i<=n;i++)
{
length*=2;
vector<string> gc_tmp(length,string(""));
for(int j=0;j<length/2;j++)
{
string str0="0"+gc[j];
string str1="1"+gc[length/2-j-1];
gc_tmp[j]=str0;
gc_tmp[j+length/2]=str1;
}
gc=gc_tmp;
}
for(int i=0;i<gc.size();i++)
ret.push_back(string_to_int(gc[i]));
return ret;
}
protected:
int string_to_int(string str)
{
cout<<str<<endl;
int m=str.size();
double res=0;
for(int i=0;i<m;i++)
{
res+=(str.at(i)-'0')*pow(2,m-i-1);
}
return int(res);
}
};