您的位置:首页 > 其它

leetcode_089 Gray Code

2016-04-17 22:46 351 查看
题目分析:

对给定的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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode