89. Gray Code

题目描述:给非负整数 n 表示二进制位数,输出所有的 n 位格雷码,以0开始。

分析:时间复杂度O(2^n),空间O(1)。

代码:用格雷码的数学公式将0 ~ 2^n - 1的所有整数转化为格雷码。公式为:整数 n 的格雷码是 n xor (n / 2),即 n 与 n 的一半异或。异或位运算:

  • 与0异或的结果还是原数
  • 与1异或 的结果是每位变为其相反数
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ans;
        int sz = 1 << n;
        ans.reserve(sz);             //reserve函数用来给vector预分配存储区大小,但没有给这段内存进行初始化。即reserve 函数分配出来的内存空间,只是表示vector可以利用这部分内存,但vector不能有效地访问这些内存空间,访问的时候就会出现越界现象,导致程序崩溃。故不能用v[i]这种下标访问
        for (int i = 0; i < sz; i ++)
            ans.push_back( btog(i) );
        return ans;
    }
    int btog(int n)          //二进制数转化为格雷码
    {
        return n ^ (n >> 1);
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容