劍指 Offer 68 數字序列中某一位的數字

數字序列中某一位的數字

數字以0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第5位(從下標0開始計數)是5,第13位是1,第19位是4,等等。

請寫一個函數,求任意第n位對應的數字。

思路:以第15位數字2爲例(2隸屬與12,兩位數,位於12從左側以0號開始下標爲1的位置) 步驟1:首先確定該數字是屬於幾位數的; 如果是一位數,n<9;如果是兩位數,n<9+90*2=189; 說明是兩位數。 步驟2:確定該數字屬於哪個數。10+(15-10)/2= 12。 步驟3:確定是該數中哪一位。

 

func findNthDigit(n int) int {
    if n < 10 {
        return n
    }
    digits := 1
    for {
        nums := count(digits)
        if n > digits*nums {
            n -= digits * nums
            digits++
        } else {
            preCount := n / digits    //目標數前有多少個digits位數
            index := n - preCount*digits //第幾位
            t := int(math.Pow(10, float64(digits-1))) + t
            return getDigit(t, index, digits)
        }
    }
}

//統計n位數有多少個,如3位數有900個,1000-100=900
func count(n int) int {
    if n == 1 {
        return 10
    }
    return int(math.Pow(10, float64(n)) - math.Pow(10, float64(n-1)))
}

//獲取整數n的第index位,如871的第0位爲8
func getDigit(n, index, amount int) int {
    res := 0
    for index < amount {
        res = n - n/10*10
        n = n / 10
        index++
    }
    return res
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章