【leetcode】Gray Code (middle)

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

 

思路: Gray Code的意思就是n位的二进制序列,相邻两个只有一位不同。观察

000 - 0

001 - 1

011 - 3

010 - 2
110 - 6
111 - 7
101 - 5
100 - 4

第0位的序列为 01 10 01 这样不断重复

第1位的序列为 0011 1100

第2位的序列为 11110000

这样我们就找到了规律。

 

我最开始是通过判段每次是第几位变化,通过异或得到新值。 每次第k为变化时满足 i = 2k + n*2(k+1)

vector<int> grayCode(int n) {

        vector<int> ans;

        ans.push_back(0);

        if(n == 0)

            return ans;



        for(int i = 1; i < (1 << n); i++)

        {

            int bit_change = 0;

            for(int j = 0; j < n; j++)

            {

                if(i % (1 << (j + 1)) - (1 << j) == 0)

                {

                    bit_change = j; break;

                }

            }

            int cur = (1 << bit_change);

            cur ^= ans.back();

            ans.push_back(cur);

        }

        return ans;

    }

 

后来看其他人的发现更简单的方法

vector<int> grayCode2(int n) {

        vector<int> ans;

        ans.push_back(0);

        if(n == 0)

            return ans;



        for(int i = 0; i < n; i++)

        {

            int inc = 1 << i;

            for(int j = ans.size() - 1; j >= 0; j--) //每次等第i - 1位正反序都存完毕时,第i位起始为0的情况也存储完了, 只需存储第i位起始为1并且低位倒序输出

            {

                ans.push_back(ans[j] + inc);

            }

        }

        return ans;

    }

 

你可能感兴趣的:(LeetCode)