zoukankan      html  css  js  c++  java
  • lintcode-411-格雷编码

    411-格雷编码

    格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异。
    给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序。一个格雷编码顺序必须以 0 开始,并覆盖所有的 2n 个整数。

    注意事项

    对于给定的 n,其格雷编码顺序并不唯一。
    根据以上定义, [0,2,3,1] 也是一个有效的格雷编码顺序。

    样例

    给定 n = 2, 返回 [0,1,3,2]。其格雷编码顺序为:
    00 - 0
    01 - 1
    11 - 3
    10 - 2

    挑战

    O(2^n) 时间复杂度。

    标签

    二进制 递归

    思路

    参考http://blog.csdn.net/beiyeqingteng/article/details/7044471
    除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。
    最小的重复单元是 0 , 1。

    000
    001
    011
    010
    110
    111
    101
    100

    所以,在实现的时候,我们完全可以利用递归,在每一层前面加上0或者1,然后就可以列出所有的格雷码。
    比如:

    • 第一步:产生 0, 1 两个字符串。
    • 第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10(注意对称)。
    • 第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了000,001,011,010,110,111,101,100。

    好了,这样就把3位元格雷码生成好了。
    如果要生成4位元格雷码,我们只需要在3位元格雷码上再加一层0,1就可以了:0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.
    也就是说,n位元格雷码是基于n-1位元格雷码产生的。

    code

    class Solution {
    public:
        
        /*
         * @param n: a number
         * @return: Gray code
         */
        vector<int> grayCode(int n) {
            // write your code here
            if (n <= 0) {
                return vector<int>(1, 0);
            }
    
            vector<string> strs = grayCodeOfString(n);
            vector<int> result;
            for (int i = 0; i < strs.size(); i++) {
                result.push_back(bitStringToInt(strs[i]));
            }
            return result;
        }
    
        vector<string> grayCodeOfString(int n) {
            vector<string> strs(pow(2, n), "");
            if (n == 1) {
                strs[0] = "0";
                strs[1] = "1";
                return strs;
            }
            vector<string> last = grayCodeOfString(n - 1);
    
            for (int i = 0; i < last.size(); i++) {
                strs[i] = "0" + last[i];
                strs[strs.size() - 1 - i] = "1" + last[i];
            }
            return strs;
        }
    
        int bitStringToInt(string str) {
            int result = 0, pow = 1;
            for (int i = str.size() - 1; i >= 0; i--) {
                result += ((str[i] - '0') * pow);
                pow *= 2;
            }
            return result;
        }
    };
    
  • 相关阅读:
    DOM节点的删除(jQuery)
    DOM节点的插入(jQuery)
    DOM节点创建(jQuery)
    jQuery的属性及样式
    jQuery选择器
    jQuery对象及DOM对象
    给大家分享一个很好用的屏幕共享小软件
    Web单浏览器登录
    Winform制作圆弧panel
    Winform 无边框窗口移动自定义边框粗细颜色
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7356773.html
Copyright © 2011-2022 走看看