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); } };
原文地址:http://blog.csdn.net/hustyangju/article/details/45047815