zoukankan      html  css  js  c++  java
  • 【LeetCode】89. 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.

    提示:

    注意,满足格雷码定义的二进制序列可能会不止一种,因此本文所指出的解法并非唯一解。

    考虑到格雷码相邻两个二进制数只能在一位上有差异,所以我们可以用一种从最低为开始,逐位加一的方法去解决这个问题,直接看一个例子,我们以n=3为例。

    我们可以令一开始的数为000,然后在最低位加一,此时所有已知格雷码为:

    000
    001

    然后我们在上述已知的格雷码中,从下往上在次低位加一:

    000
    001
    011
    010

    这里要注意加一的顺序,必须要从下往上加,因为新增加的数字如果是从上往下产生的,那么就相当于是同时在多个位上发生改变,而从下往上加可以确保只有一位发生了改变,又因为原先有的相邻格雷码之间只有一位有区别,如果在同一个位置上都加一,相邻两个之间的差异仍然只有一,因此性质还是成立的。

    最后我们在最高位上加一,注意还是要从下往上:

    000
    001
    011
    010
    110
    111
    101
    100

    代码:

    class Solution {
    public:
        vector<int> grayCode(int n) 
        {         
            vector<int> res(1, 0);
            for (int i = 0; i < n; ++i) {
                int size = res.size();
                while (size--) {
                    int curNum = res[size];
                    curNum += (1 << i);
                    res.push_back(curNum);
                }
            }
            return res;
        }
    };
  • 相关阅读:
    VS2010+WPF+LINQ for MySQL
    WPF项目中解决ConfigurationManager不能用(转)
    DBLinq (MySQL exactly) Linq To MySql(转)
    循环左移实现
    C166 -MDH
    C166 8位字节位运算赋值-代码优化
    c166 -div
    js实现类似新闻条目人物简介不间断的滚动
    js实现新闻条目滚动效果
    php写杨辉三角算法
  • 原文地址:https://www.cnblogs.com/jdneo/p/5228780.html
Copyright © 2011-2022 走看看