格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。
示例 1:
输入: 2 输出:[0,1,3,2]
解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1]
也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1
基本思路:很简单
- 对于0来说 就是0 ,对于1来说为0和1,及在0的基础上增加了一个2的0次方。
- 对于2来说是 0 1 3 2是不是在0,1的基础上都加上了2的1次方。
- 以此类推……
- 注意,如果直接相加的话结果会是0,1,2,3。这不是我们想要的结果,所以在函数_grayCode中将Tem数组进行reverse。
AC解:
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> Res(1,0);
for (int i = 1; i <= n; i++) {
_grayCode(Res, pow(2, i - 1));
}
return Res;
}
void _grayCode(vector<int> &Res, int Now_Value) {
vector<int> Tem = Res;
reverse(Tem.begin(), Tem.end());
for (int i = 0; i < Tem.size(); i++) {
Tem[i] += Now_Value;
}
Res.insert(Res.end(), Tem.begin(), Tem.end());
}
};