この問題は
、一連の数値のエンコードで説明されています。隣接する2つのコードが2進数で1つだけ異なる場合、そのエンコードはグレイコードと呼ばれます。関数を記述し、再帰的方法を使用してNビットを生成してください。グレイコード。
整数nを指定すると、0から始まるnビットのグレイコードを返します。
テストサンプル:
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 0が先行し、このためにグレイコードはn = 1であり、プラス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;
}
Niuke.com の質問では、テストケースの結果がn = 2 だったため、合格ケースを送信できなかったことがわかりました。00,01,10,11ではなく、00,01,11,10が返されました
n = 3 000 001 011 010 110 111 101 100
n-2を例にとると、配列を挿入する場合、挿入は元の配列の逆の順序で実行されます。最初のforループがわずかに変更されている限り、アクセスできます!
コード:
#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;
}