剑指 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
}

相关