本问题对应的 leetcode 原文链接:剑指 Offer 44. 数字序列中某一位的数字

问题描述

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0

限制:

  • 0 <= n < 2^31

解题思路

视频讲解直达: 本题视频讲解

代码实现

class Solution {
    public int findNthDigit(int n) {
        if(n == 0){
            return 0;
        }

        long bit = 1;
        int i = 1;
        long count = 9;

        while(count < n){
            n = (int)(n - count);
            bit = bit * 10;
            i++;
            count = bit * i * 9;
        }
        // 确定是在这个区间的哪个数
        long num = bit + (n - 1) / i;
        // 确定在 Num 的那个字符
        int index = (n - 1) % i + 1;
        int res = (int)(num / Math.pow(10, i - index)) % 10;

        return res;
    }
}

时间复杂度:O(logn)
额外空间复杂度:O(1)

Python

class Solution(object):
    def findNthDigit(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 0:
            return 0

        bit = 1
        i = 1
        count = 9

        while count < n:
            n -= count
            bit *= 10
            i += 1
            count = bit * i * 9

        # 确定是在这个区间的哪个数
        num = bit + (n - 1) // i
        # 确定在 Num 的那个字符
        index = (n - 1) % i + 1
        res = int(num // (10 ** (i - index))) % 10

        return res

C++

class Solution {
public:
    int findNthDigit(int n) {
        if(n == 0){
            return 0;
        }

        long bit = 1;
        int i = 1;
        long count = 9;

        while(count < n){
            n = n - count;
            bit = bit * 10;
            i++;
            count = bit * i * 9;
        }
        // 确定是在这个区间的哪个数
        long num = bit + (n - 1) / i;
        // 确定在 Num 的那个字符
        int index = (n - 1) % i + 1;
        int res = (int)(num / pow(10, i - index)) % 10;

        return res;
    }
};

Go

func findNthDigit(n int) int {
    if n == 0 {
        return 0
    }

    var bit int64 = 1
    i := 1
    count := int64(9)

    for count < int64(n) {
        n -= int(count)
        bit *= 10
        i++
        count = bit * int64(i) * 9
    }

    // 确定是在这个区间的哪个数
    num := bit + int64((n-1)/i)
    // 确定在 Num 的那个字符
    index := (n - 1) % i + 1
    res := int(num / int64(math.Pow10(i-index))) % 10

    return res
}

JS

/**
 * @param {number} n
 * @return {number}
 */
var findNthDigit = function(n) {
    if (n === 0) {
        return 0;
    }

    let bit = 1;
    let i = 1;
    let count = 9;

    while (count < n) {
        n = n - count;
        bit = bit * 10;
        i++;
        count = bit * i * 9;
    }

    // 确定是在这个区间的哪个数
    let num = bit + Math.floor((n - 1) / i);
    // 确定在 Num 的那个字符
    let index = (n - 1) % i + 1;
    let res = Math.floor(num / Math.pow(10, i - index)) % 10;

    return res;
};

发表回复

后才能评论