LeetCode:89. 格雷编码

题目描述

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 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)) // 转为十进制
};

测试结果

猜你喜欢

转载自blog.csdn.net/qq_39025670/article/details/104234424