题目描述:
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。
示例 1:
输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2
对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。
00 - 0
10 - 2
11 - 3
01 - 1
示例 2:
输入: 0
输出: [0]
解释: 我们定义格雷编码序列必须以 0 开头。
给定编码总位数为 n 的格雷编码序列,其长度为 2 的 n 次方。当 n = 0 时,长度为 2 的 0 次方 等于 1。
因此,当 n = 0 时,其格雷编码序列为 [0]。
题目链接:https://leetcode-cn.com/problems/gray-code/
题目分析:
通过上图我们可以发现,格雷编码上下是对称的;而 3 的后部分是 2 的输出结果,然后在其前面补充 0 或 1.
题目答案:
var grayCode = function(n) {
// 递归,用来获取输入为n的格雷编码序列
let make = n => {
if (n === 0) {
return [0]
} else if (n === 1) {
return [0, 1]
} else {
let prev = make(n - 1) // 前一个的格雷编码
let res = []
// 格雷编码的总长度: 2的n次方
let max = Math.pow(2, n)
for (let i = 0, len = prev.length; i < len; i++) {
// 从首位开始进行填充
res[i] = `0${prev[i]}` // 首
res[max - i - 1] = `1${prev[i]}` // 尾
}
return res
}
}
return make(n).map(item => parseInt(item, 2)) // 转为十进制
};
测试结果: