题目
格雷编码
思路
- 对于n的格雷码,是由下面的两个并集组成的。
1.正序取n-1的格雷码,在前面加"0"。
2.逆序取n-1的格雷码,在前面加“1”.
代码
class Solution {
public:
//根据二进制来获取十进制的数值
int getNum(string s){
int n = s.size(), ans = 0;
for(int i = 0; i < n;i++)
ans += (s[i] - '0') * (1 << (n - 1 - i));
return ans;
}
//获取格雷码
vector<int> grayCode(int n) {
//这里是为了边界条件0设置的
int len = max(2, n + 1);
//保存相对应的格雷码
vector<vector<string> > gn(len);
//初始化
gn[0] = {"0"};
gn[1] = {"0", "1"};
for(int i = 2;i <= n;i++){
for(auto s : gn[i - 1]){//正序取前一个的string,在所有的前面加"0"
string str = "0" + s;
gn[i].push_back(str);
}
for(int j = gn[i - 1].size() - 1;j >= 0;j--){//逆序取前一个的string,在所有的前面加"1"
string str = "1" + gn[i - 1][j];
gn[i].push_back(str);
}
}
vector<int> ans;
for(auto s : gn[n]) ans.push_back(getNum(s));//二进制变成十进制
return ans;
}
};