网站栏目管理建设,手机app模板,互动营销的案例及分析,花垣网站建设89.格雷编码
观察一下n不同时的格雷编码有什么特点 n1 [0,1] n2 [0,1,3,2] n3 [0,1,3,2,6,7,5,4] …… 可以看到nk时#xff0c;编码数量是nk-1的数量的一倍 同时nk编码的前半部分和nk-1一模一样 nk编码的最后一位是2k-1 后半部分的编码是其对应的前半部分的对称的位置的数字…89.格雷编码
观察一下n不同时的格雷编码有什么特点 n1 [0,1] n2 [0,1,3,2] n3 [0,1,3,2,6,7,5,4] …… 可以看到nk时编码数量是nk-1的数量的一倍 同时nk编码的前半部分和nk-1一模一样 nk编码的最后一位是2k-1 后半部分的编码是其对应的前半部分的对称的位置的数字2k-1 如图可以看出原理为了增加长度后使得隔着中轴线相邻的第2k-1位和第2k-11位差一位那么就要在新增加的位上由0变1(因为前半部分出现过在原有的位上是1的编码了 也就是数字上增加了2k-1 至于其他的位因为按照前面的编码放置1的顺序是唯一的所以只要在最高位都填1然后对称着顺序来就好了
因此代码为
class Solution {
public:vectorint grayCode(int n) {vectorint gray;gray.push_back(0);gray.push_back(1);if(n1)return gray;for(int i2;in;i){for(int jpow(2,i-1)-1;j0;j--){gray.push_back(gray[j]pow(2,i-1));}}return gray;}
};格雷编码有相当多的生成方法 还有一种比如说G(i)(i ^ (i 1))也就是G(i)i^(i/2) 从这个图可以看出如果二进制码字的第 i 位和 i1 位从右边开始数相同则对应的格雷码的第i位为0否则为1当i1n时二进制码字的第n位被认为是0即第n-1位不变
class Solution {
public:vectorint grayCode(int n) {vectorint gray;for(int i0;ipow(2,n);i)gray.push_back(i^i1);return gray;}
};