例题描述:
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。
实例1:
输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2
思路:
假设n阶的格雷编码为G(n);n+1阶为G(n+1):
①给 G(n) 阶格雷码每个元素二进制形式前面添加 0,得到 G’(n);
②设 G(n)G(n) 集合倒序(镜像)为 R(n),给 R(n) 每个元素二进制形式前面添加 1,得到 R’(n);
③G(n+1) = G’(n) ∪ R’(n) 拼接两个集合即可得到下一阶格雷码。
由于最高位前默认为 0,因此 G′ (n)=G(n),只需在 res即 G(n)后添加 R′(n) 即可;
代码:
class Solution {
public:
vector<int> grayCode(int n) {
vector<int>Test;
int m=1;
Test.push_back(0);
for(int i=1;i<=n;i++){
for(int j=Test.size()-1;j>=0;j--){//构成逆序
Test.push_back(m+Test[j]);//与n-1中各个编码相加
}
m<<=1;//二进制左移一位,低位补0,相当于乘以2,如01变为10,
}
return Test;
}
};
方法借鉴:可查看原出处 侵删
第一次写这个不是很熟练,不正确处还望海涵,这是今天刚做的一个力扣题,很少接触位运算的我一脸懵逼,在高人指点下才勉强明白,为了加强印象,抄袭 结合大佬方法写下了这篇,最后,算法交流群:812791932,里面很多和蔼可亲的大佬随时交流。