解题思路:
这道题本质上是一道数学题,等于说自己得出一个结论,然后证明结论是对的。首先对于任意一个小于2的n次方的数m,如果它对应位数与后一位异或(最后一位与0异或)得到的数作为编码序列, 那么m+1,它其实是改变的k个位与m不同,换句话说,m的后k-1位是1,m+1的后k-1位是0,m+1进行同样的异或操作话,只有一位与m的编码序列不同,这正是我们要得到的结论,如此循环直到n-1,代码如下:
class Solution {
public:
vector<int> grayCode(int n) {
// 2的n次方的长度
int size = 1 << n;
vector<int> res(size);
for(int i = 0; i < size; i ++) {
// i右移1与i异或,相当于后一位与前一位异或
res[i] = (i >> 1) ^ i;
}
return res;
}
};