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⌋编写相应代码,用异或解决问题
本题考察对新定义的数字找规律的能力,将答案列举出来再归纳总结即可解决