题目描述
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1
返回:[“0”,“1”]
分析
1、n=1时,返回0,1
2、n=2时,返回00,01,10,11
3、n=3时,返回000,001,010,011,100,101,110,111
通过观察n=1,2,3时返回的格雷码可以发现这样的规律:
1、n=2的格雷码是在n=1的格雷码按顺序在前面加0,加1
2、n时的格雷码的长度是n-1时的格雷码的长度的两倍
算法实现:
#include <iostream>
#include<vector>
using namespace std;
vector<string> getGray(int n) {
// write code here
vector<string> result;
if(n == 1){
result.push_back("0");
result.push_back("1");
return result;
}else{
result = getGray(n-1);
int currentsize = (int)result.size();
for(int i = 0; i < currentsize; i++){
result.push_back(result.at(i));
}
for(int i = 0; i < currentsize; i++){
result.at(i) = "0" + result.at(i);
}
for(int i = currentsize; i < (int)result.size(); i++){
result.at(i) = "1" + result.at(i);
}
return result;
}
}
int main(){
vector<string> v;
v = getGray(2);
for(int i = 0; i < v.size(); i++){
cout << v.at(i) << " ";
}
cout << endl;
return 0;
}
在牛客网刷题是,发现这样并不能提交通过案例,原因是测试案例结果为
n=2时,返回00,01,11,10 而不是 00,01,10,11
n=3时,返回000 001 011 010 110 111 101 100
以n-2为例,插入数组时是按原数组相反的顺序进行插入的,因此只要稍微修改第一个for循环,即可access!
代码:
#include <iostream>
#include<vector>
using namespace std;
vector<string> getGray(int n) {
// write code here
vector<string> result;
if(n == 1){
result.push_back("0");
result.push_back("1");
return result;
}else{
result = getGray(n-1);
int currentsize = (int)result.size();
for(int i = currentsize - 1; i >= 0; i--){
result.push_back(result.at(i));
}
for(int i = 0; i < currentsize; i++){
result.at(i) = "0" + result.at(i);
}
for(int i = currentsize; i < (int)result.size(); i++){
result.at(i) = "1" + result.at(i);
}
return result;
}
}
int main(){
vector<string> v;
v = getGray(2);
for(int i = 0; i < v.size(); i++){
cout << v.at(i) << " ";
}
cout << endl;
return 0;
}