面试题60:递归生成格雷码

来源:互联网 发布:linux man 1 2 3 编辑:程序博客网 时间:2024/05/16 11:50

格雷码:任意相邻的代码只有一位二进制位不同。

每个二进制数为n位,每个二进制数相比,都只有一位二进制码不相同;

比如n=1,{0,1};

n=2,{00,01,11,10};

n=3,{000,001,011,010,110,111,101,100}

思路:

以n=3的情况为例

000

001

011

010

110

111

101

100

在实现的时候,我们可以在上一层加上0或1,用递归来实现。

第一步:产生0和1两个字符串

第二步:在两个字符串前面分别加上0和1,得到00,01,11,10(注意对称)

第三步:在第二步的基础上给每个字符串加上0和1

由上面分析可知:

n位格雷码是基于n-1位格雷码生成的。

#include <iostream>#include <string>#include <vector>#include <map>using namespace std;vector<string> getGray(int n) {if (n == 1){vector<string> re;re.push_back("0");re.push_back("1");return re;}vector<string> last = getGray(n - 1);int curSize = last.size() * 2;vector<string> current(curSize);for (int i = 0; i < last.size(); i++){current[i] = "0" + last[i];current[curSize - 1 - i] = '1' + last[i];}return current;}int main(){vector<string> re = getGray(4);for (int i = 0; i < re.size(); i++)cout << re[i] << endl;return 0;}


0 0