题目描述
格雷码是一个二进制数系统,满足相邻两个数只有一位不同。
给定一个非负整数 nn,表示格雷码的位数,请输出一个合法的格雷码序列。
格雷码序列必须以0开始。
例如,给定 n=2n=2,返回 [0, 1, 3, 2]。它表示的格雷码序列是:
00 - 0
01 - 1
11 - 3
10 - 2
注意:对于一个给定的 nn,格雷码序列并不唯一。例如 [0, 2, 3, 1] 也是一个合法的格雷码序列。
思路
找规律,构造了一种根据Sk-1来构造Sk的方法,Sk前半部分等于Sk-1,后半部分等于Sk-1倒序并在最高为加1,
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res;//存储最终的格雷曼
res.push_back(0);
int t=1;//使得加上一个前导0
while(n--){
vector<int> newRes;//本次的格雷曼
for(int i=0;i<res.size();i++){
newRes.push_back(res[i]);//前半部分照搬
}
for(int i=res.size()-1;i>=0;i--){
newRes.push_back(t+res[i]);//后半部分逆序并加一个前导0
}
t*=2;//前导0
//t<<1 用位运算也行
res=newRes;
}
return res;
}
};