1. 程式人生 > 實用技巧 >leetcode刷題筆記八十九題 格雷編碼

leetcode刷題筆記八十九題 格雷編碼

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 的格雷編碼序列,其長度為 2n。當 n = 0 時,長度為 20 = 1。
因此,當 n = 0 時,其格雷編碼序列為 [0]。

/**
分析格雷編碼特質,其實質是garycode(n) = garycode(n-1).map(_ | 0 << n-1) ++ garycode(n-1).map(_ | 1 << n-1),即n次的格雷編碼為n-1次格雷編碼本身與翻轉結果的頭部插入1
與 1 << n-1 按位取或 其實質是將1 插入graycode(n-1)的頭部,也可以直接加上2^(n-1)
綜合而言,按位取或速度較快且與Math.pow(2, n-1)計算結果為Double,需要轉換
*/
import scala.collection.mutable
object Solution {
    def grayCode(n: Int): List[Int] = {
        n match {
            case 0 => List[Int](0)
            case _ => grayCode(n-1) ++ grayCode(n-1).reverse.map(_ | 1 << n-1).toList
        }
    }
}

//
import scala.collection.mutable
object Solution {
    def grayCode(n: Int): List[Int] = {
        n match {
            case 0 => List[Int](0)
            case _ => grayCode(n-1) ++ grayCode(n-1).reverse.map(_ + Math.pow(2, n-1).toInt).toList
        }
    }
}