列表

详情


400. 第 N 位数字

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。

 

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int findNthDigit(int n) { } };

python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-13 12:57:35

# i位数的数字个数
dp = [0] * 11
for i in range(1, 11):
    # 位数i*个数10 ** i - 10 ** (i - 1)
    dp[i] = (10 ** i - 10 ** (i - 1)) * i


class Solution:
    def findNthDigit(self, n: int) -> int:
        
        # 先确定是几位数
        first = cnt = 0
        for x in range(1, 11):
            if n > dp[x]:
                n -= dp[x]
            else:
                first = 10 ** (x - 1)
                cnt = x
                break
        # 在确定是哪个数
        num = first + (n - 1) // cnt
        # 计算其索引位置
        j = n - (num - first) * cnt - 1
        return int(str(num)[j])

python3 解法, 执行用时: 28 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-13 12:56:05

class Solution:
    def totalDigits(self, length: int) -> int:
        digits = 0
        curCount = 9
        for curLength in range(1, length + 1):
            digits += curLength * curCount
            curCount *= 10
        return digits

    def findNthDigit(self, n: int) -> int:
        low, high = 1, 9
        while low < high:
            mid = (low + high) // 2
            if self.totalDigits(mid) < n:
                low = mid + 1
            else:
                high = mid
        d = low
        prevDigits = self.totalDigits(d - 1)
        index = n - prevDigits - 1
        start = 10 ** (d - 1)
        num = start + index // d
        digitIndex = index % d
        return num // 10 ** (d - digitIndex - 1) % 10

上一题