leetcode:Gray Code


一、テーマ
数nを入力し、この数のグレイコードを出力します.
たとえば、2を入力して{0,1,3,2}を返します.
二、分析
1、バイナリコード->グレイコード(符号化):右端の1つから、各ビットと左側の1つのイソOR(XOR)を順番に、グレイコードに対応するビットの値として、一番左の1つは変わらない(左が0に相当する).(以上のコードに対応するforループ内のループ体).
グレイコード->バイナリコード(復号):左の2番目のビットから、各ビットと左のビットが復号された値を、そのビットが復号された値として異ならせる(最も左のビットは依然として変わらない).
2、規則を探す
3ビットグレイコードを例に挙げます.
         0 0 0
         0 0 1
         0 1 1
         0 1 0
        1 1 0
        1 1 1
        1 0 1
        1 0 0
nビット目のグレイ符号は,n−1ビットのグレイ符号の一部と,1<(n−1)とn−1ビットのグレイ符号の逆シーケンスの和を加えた2つの部分から構成されていることがわかる.
次のようになります.
       (0)00
      (0)01
      (0)11
      (0)10
        100+010=110
        100+011=111
        100+001=101
        100+000=100
 
class Solution {
public:
    vector<int> grayCode(int n) {
        int num = 1<<n;
		vector<int> ans;
		ans.reserve(num);
		for(int i=0;i<num;i++)
			ans.push_back(i^(i>>1));
		return ans; 
    }
};
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ans;
        if(n==0){
        	ans.push_back(0);
        	return ans;
        }
        vector<int> res = grayCode(n-1); 
        int len = res.size()-1;
        int adder = 1<<(n-1);
        for(int i=len;i>=0;i--){
        	res.push_back(adder+res[i]);
        }
        return res;
    }
};