n 位格雷码序列 是一个由 2 ** n 个整数组成的序列,其中:

  • 每个整数都在范围 [0, 2 ** n - 1] 内(含 0 和 2 ** n - 1)
  • 第一个整数是 0
  • 一个整数在序列中出现 不超过一次
  • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
  • 第一个 和 最后一个 整数的二进制表示 恰好一位不同

给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

思路

  1. (0) (1)
  2. (00 01) (11 10)
  3. (000 001 011 010) (110 111 101 100)
  4. ……
  5. T[i + 1] = T[i] concat T[i].reverse().map(val => val + 2 ** i)
1
2
3
4
5
6
7
8
var grayCode = function (n) {
let items = [0]
for (let i = 0; i < n; ++i) {
const inc = 1 << i
items = [...items, ...items.reverse().map((val) => val + inc)]
}
return items
}