グレイコードC ++実装を生成する

この問題は
、一連の数値のエンコードで説明されています。隣接する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;
}
21件のオリジナル記事を掲載 いいね!0 訪問数163

おすすめ

転載: blog.csdn.net/qq_45227330/article/details/105025054