leetcode_089 Gray Code

题目分析:

  • 对给定的n,求0~2^(n-1)按照特定顺序排序,其中第一个数必须为0,相邻两个数的二进制表示有且只有一位不同,即求n位数的格雷码操作。

解题思路:

  • 二进制转格雷码实现

    假设3为的二进制数,对应的二进制数和格雷码分别如下:

    二进制数: 000 001 010 011 100 101 110 111

    格雷码: 000 001 011 010 110 111 101 100

    二进制码转格雷码使用异或转换实现,具体步骤如下:

    1)对n为二进制的码字,从右到左,以0到n-1编号;

    2)如果二进制码字的第i为与第i+1为相同,则对应的格雷码第i位为0,否则为1(但i+1=n时,二进制码的第n位被认为是0,即第n-1位不变。

    总结上面方法,即格雷码中最右边第一位的值为二进制码的最右边的值,剩下的右边期第i位上的值为右边第i-1位于右边起第i为上的值异或的结果。举例如下:

    1011 = 1(最右边第一位不变),1(最右边第一位和最右边第二位异或,1^0=1),1(最右边第二位和最右边第三位异或,0^1=1),0(最右边第三位和最右边第四位异或,1^1=0)

    上面的实质为(1011>>1)^(1011) = 1110。

  • 实现程序

    class Solution
    {
        public:
            vector<int> grayCode(int n)
            {
                // n为二进制数最大值 
                int size = 1 << n;
                // 格雷码返回值 
                vector<int> grayCodes;
                grayCodes.resize(size);
                // 循环遍历,将二进制数转为对应的格雷码 
                for (int i = 0; i < size; i++)
                {
                    // 利用i ^ (i>>1)实现 
                    int gCode = i ^ (i >> 1);
                    grayCodes[i] = gCode; 
                }
                return grayCodes; 
            }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值