n 位格雷码序列 是一个由 2n
个整数组成的序列,其中:
- 每个整数都在范围
[0, 2n - 1]
内(含0
和2n - 1
) - 第一个整数是
0
- 一个整数在序列中出现 不超过一次
- 每对 相邻 整数的二进制表示 恰好一位不同 ,且
- 第一个 和 最后一个 整数的二进制表示 恰好一位不同
给你一个整数 n
,返回任一有效的 n 位格雷码序列 。
思路一:找规律
int* grayCode(int n, int* returnSize) {int *ret = (int *)malloc((1 << n) * sizeof(int));ret[0] = 0;int ret_size = 1;for (int i = 1; i <= n; i++) {for (int j = ret_size - 1; j >= 0; j--) {ret[2 * ret_size - 1 - j] = ret[j] | (1 << (i - 1));}ret_size <<= 1;}*returnSize = ret_size;return ret;
}
分析:
可将格雷码先列举几个找规律,当n=1时格雷码为0,1,n=2时格雷码为0,1,3,2,可以向后递推,发现前面的格雷码的顺序可以不变,直接考虑下一位的格雷码即可,同时发现每当n增加一,即二进制数多一位,原来的顺序向后递推一位,根据该规律编写相应代码解决
思路二:公式
int* grayCode(int n, int* returnSize) {int ret_size = 1 << n;int *ret = (int *)malloc(ret_size * sizeof(int));for (int i = 0; i < ret_size; i++) {ret[i] = (i >> 1) ^ i;}*returnSize = ret_size;return ret;
}
分析:
格雷码也可以使用公式直接求出。第 i (i≥0)i~(i \geq 0)i (i≥0) 个格雷码即为:gi=i⊕⌊i/2⌋编写相应代码,用异或解决问题
总结:
本题考察对新定义的数字找规律的能力,将答案列举出来再归纳总结即可解决