这个题考察的是二进制的移位,当不是最高位的时候,就需要将格雷码编码后的结果向右移动 n-m-1 位,然后提取出该位的值。

// c++ version
class GrayCode {
public:
    string int2Gray(int num, int n, int m, int gray) {
        string ans = "";
        if (m == n) return ans;
        if (m == 0) {                                 // 取最高位,没有移位
            int tmp = num >> (n - 1);
            ans += to_string(tmp);
        } else {                                     // 不是最高位
            int tmp = gray >> (n - m - 1);
            tmp &= 1;
            ans += to_string(tmp);
        }
        return ans+=int2Gray(num, n, m+1, gray);
    }
    vector<string> getGray(int n) {
        vector<string> ans;
        int i = 0;
        while (i <= (pow(2, n)-1)) {
            int gray = i ^ (i >> 1);              // 格雷码编码方式
            ans.push_back(int2Gray(i, n, 0, gray));
            i++;
        }
        return ans;
    }
};