腾讯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;
}
大家可以留言讨论。