题目分析:
- 对给定的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; } };