89. Gray Code

来源:互联网 发布:淘宝联盟怎么领券 编辑:程序博客网 时间:2024/05/16 04:52

题目:Gray Code

原题链接:https://leetcode.com/problems/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.

格雷码是二进制数字串,当中每两个连续的数字中只有一个二进制位上的值不一样,给出一个非负的整数代表二进制位的总位数,输出一串符合要求的格雷码,注意从 0 开始。

例:n = 2
那么序列可以是

二进制位 值 00 0 01 1 11 3 10 2

返回[ 0, 1, 3, 2 ]
注意返回的序列结果是不唯一的,例如[ 0, 2, 3, 1 ]也是可以的。

题目的难点在于要保证每两个连续的数只能有一个二进制位不同。
不放把样本放大一点来看,假设n = 4:

序号 二进制位 值 0 0000 0 1 0001 1 2 0011 3 3 0010 2 4 0110 6 5 0111 7 6 0101 5 7 0100 4 8 1100 12 9 1101 13 10 1111 15 11 1110 14 12 1010 10 13 1011 11 14 10001 9 15 1000 8

这是一个符合要求的序列,序号这一列表示他们在数组中的顺序,我们可以好好的观察一下。
不考虑更高位的情况下,序号 0 到 1 是 n = 1 的结果, 序号 0 到 3 是 n = 2 的结果, 序号 0 到 7 是 n = 3的结果, 序号 0 到 15 是 n = 4 的结果,观察 n = 2 和 n = 1的两个结果,可以发现,n = 2的结果如果不考虑第2位的话,只看第一位是镜面对称的,即最后一位是 0 ,1,1,0 这样的对称方式,同理 n = 3 除了最高位之外剩下的也是 由 n = 2 对称而来,即 00,01,11,10,10,11 ,01,00.
这样思路就出来了:
n 每增加1 位,把当前的最高位置为1,然后按照从后往前的顺序加上前面的所有的数。

代码如下:

class Solution {public:    vector<int> grayCode(int n) {        vector<int> ans;        ans.push_back(0);        if (!n) return ans;        ans.push_back(1);        int index = 1;        while(index < n) {            int len = ans.size();            int temp = 1;            for (int i = 0; i < index; ++i) temp = (temp << 1); // 将最高位置1            // 把之前的数从大到小加起来形成对称            for (int i = len - 1; i >= 0; --i) {                ans.push_back(temp + ans[i]);            }            index++;        }        return ans;    }};
0 0
原创粉丝点击