• 【LeetCode】89. Gray Code (2 solutions)


    Gray Code

    The gray code is a binary numeral system where two successive values differ in only one bit.

    Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

    For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

    00 - 0
    01 - 1
    11 - 3
    10 - 2
    

    Note:
    For a given n, a gray code sequence is not uniquely defined.

    For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

    For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

    解法一:

    列出前几个格雷码观察规律:

    n=3

    0 0 0 

    0 0 1

    0 1 1

    0 1 0

    1 1 0

    1 1 1

    1 0 1

    1 0 0

    可以发现,最右边第0位是以0110循环,第1位是以00111100循环……

    由此可知,第j位在[2j, 2j+2j+1)是1,其余为0进行循环。每个循环段包含的格雷码总数为2j+2

    因此对于第i个格雷码的第j位,需要根据i判断落在第j循环段的0位还是1位。

    将i从左往右扫一遍,确定0/1后左移,即可。

    class Solution {
    public:
        vector<int> grayCode(int n) {
            vector<int> result;
            for(int i = 0; i < pow(2.0,n); i ++)
            {//2^n numbers
                int value = 0;
                for(int j = n-1; j >= 0; j --)
                {//jth digit from right to left
                    int divisor = pow(2.0, j+2);
                    int r = i%divisor;
                    if(r >= pow(2.0, j) && r < pow(2.0, j)+pow(2.0, j+1))
                        value += 1;
                    if(j == 0)
                        break;
                    value <<= 1;
                }
                result.push_back(value);
            }
            return result;
        }
    };

    解法二:

    n=0时,result={0}

    n=1时,result={0,1}。1可以看做对0的第1位置1后再次加入。

    n=2时,result={00,01,11,10}。11可以看做对01的第2位置1,10可以看做对00的第2位置1后再次加入。

    ……

    即对result已有的中间结果,逆序处理,对每个成员的相应位置1。

    class Solution {
    public:
        vector<int> grayCode(int n) {
            vector<int> ret(1, 0);
            for(int i = 0; i < n; i ++)
            {
                int size = ret.size();
                for(int j = size-1; j >= 0; j --)
                {
                    int num = ret[j];
                    num += 1<<i;
                    ret.push_back(num);
                }
            }
            return ret;
        }
    };

  • 相关阅读:
    Oracle 11g设置IP访问限制
    ORA-01940 无法删除当前已连接的用户之解决方案
    如何终止正在进行expdp导出数据的任务
    Oracle权限管理详解
    linux yum配置代理
    命令别名设置: alias, unalias
    Linux 桌面双击运行脚本
    变量内容的删除、取代与替换 (Optional)
    linux查看和修改PATH环境变量的方法
    文件系统及程序的限制关系: ulimit
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4146821.html
Copyright © 2020-2023  润新知