腾讯2016研发工程师编程题(一)----[编程题] 生成格雷码

来源:互联网 发布:冷艳锯 知乎 编辑:程序博客网 时间:2024/06/02 00:58

腾讯2016研发工程师编程题(一)—-[编程题] 生成格雷码

时间限制:3秒空间限制:32768K

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。

测试样例:

1

返回:[“0”,”1”]

要实现该题,首先要弄清楚什么是格雷码。可以查看百度百科里面对格雷码的解释。题目中要求用递归方法来生成格雷码,可以查看百度百科中,对通过递归法来生成格雷码的解释如下:

这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造,可以对应下表来进行查看:
1位格雷码有两个码字
(n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
(n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1

1位格雷码 2位格雷码 3位格雷码 4位格雷码 0 00 000 0000 1 01 001 0001 11 011 0011 10 010 0010 110 0110 111 0111 101 0101 100 0100 1100 1101 1111 1110 1010 1011 1001 1000

有了上面的描述,然后实现起来就非常的容易,我的实现如下:

#include <iostream>#include <vector>#include <string>using namespace std;class GrayCode {public:    vector<string> getGray(int n) {        vector<string> v,temp;        // write code here        if( n == 1 )        {            v.push_back("0");            v.push_back("1");            return v;        }        temp = getGray(n-1);        for (vector<string>::iterator iter = temp.begin(); iter != temp.end(); iter++)        {            //cout << "0000 " << *iter << endl;            v.push_back("0"+(*iter));        }        for (vector<string>::reverse_iterator  riter = temp.rbegin(); riter != temp.rend(); riter++)        {            //cout << "1111 " << *riter << endl;            v.push_back("1"+(*riter));        }        return v;    }};int main(){    int num;    vector<string> v;    GrayCode grayCode;    cin >> num;    v = grayCode.getGray(num);    for( size_t i=0;i<v.size();++i)    {        if( !(i%2) )        {            cout << "[ \"" << v[i] << "\" ,";         }        else        {            cout << "\"" << v[i] << "\" ]" << endl;         }    }    return 0;}

大家可以留言讨论。

原创粉丝点击