题目
思路一 对称生成
根据格雷码的镜像法则,二进制长度为n的格雷码数量是二进制长度为n-1的格雷码数量的两倍,而且在长度为n-1格雷码后追加倒序且二进制最高位置1的长度为n-1的格雷码就是二进制长度为n的格雷码。
代码一
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ans;
ans.reserve(1<<n);
ans.push_back(0);
for(int i=1;i<=n;i++){
int m=ans.size();
for(int j=m-1;j>=0;j--){
int num=(1<<(i-1))|ans[j];
ans.push_back(num);
}
}
return ans;
}
};
思路二 二进制直接构造格雷码
每一位数右移一位,再和原数据做异或操作。
代码二
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ans(1<<n);
for(int i=0;i<(1<<n);i++)
ans[i]=(i>>1)^i;
return ans;
}
};