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

腾讯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位格雷码
0000000000
1010010001
110110011
100100010
1100110
1110111
1010101
1000100
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;
}

大家可以留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值