天天看點

leetcode:89格雷編碼

var make = function(n) {
  if (n === 0) return ['0']
  if (n === 1) {
    return ['0', '1']
  } else {
    let prev = make(n - 1)
    let max = Math.pow(2, n) - 1
    let result = new Array(max)
    for (let i = 0; i < prev.length; i++) {
      result[i] = `0${prev[i]}`
      result[max-i] = `1${prev[i]}`
    }
    return result
  }
};

var grayCode = function(n) {
  let binaryArr = make(n)
  return binaryArr.map(item => {
    return parseInt(item, 2)
  })
};           

複制

題目解析:

比如輸入2,代表輸出((兩位))的二進制(格雷編碼)所對應的十進制。注意,必須是以0開頭的哈。0完了才是1的開始哈。

然後下面是找·規律。記住堆成的輸出。

找規律:

leetcode:89格雷編碼

輸入1的時候,代表2的1次方。

輸入2的時候,代表2的二次方。

輸入3的時候,代表2的三次方。

而這些次方分成了兩份,一份是0,一份是1.

0完了才是1的開始。

記住,n以n-1為基礎的,3以2為基礎,對稱的,比如2的是00 01 11 10,00是3的第一個和最後一個,并且第一個前面加上0,後面是00.最後一個前面加上1.後面是00.以此類推。然後第二個是001,最後的第二個是101。。。。。。。。

let prev = make(n - 1)           

複制

要想知道n得知道n-1.

let max = Math.pow(2, n) - 1           

複制

看一看n多少次把,為什麼-1.,因為從0開始的啊,數組。

for (let i = 0; i < prev.length; i++) {
      result[i] = `0${prev[i]}`
      result[max-i] = `1${prev[i]}`
    }           

複制

第一位與最後,第二位與最後第二位。第三位與最後的第三位,第四位與最後的第四位。。。。

遞歸的哈。

var grayCode = function(n) {
  let binaryArr = make(n)//遞歸
  return binaryArr.map(item => {
    return parseInt(item, 2)//然後存到map裡面。把二進制item轉換成十進制
  })
};           

複制