Leetcode 400. 第N个数字(Nth Digit)

Leetcode 400. 第N个数字

1 题目描述(Leetcode题目链接

  在无限的整数序列 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , ⋯ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, \cdots 1,2,3,4,5,6,7,8,9,10,11,中找到第 n n n 个数字。注意: n n n 是正数且在32为整形范围内 ( n < 231 n < 231 n<231)。

输入:
3
输出:
3
输入:
11
输出:
0

说明:11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。

2 题解

  本题的题目描述可能不是很清楚,可以把题目理解为无限的整数序列按顺序组成的一个长字符串中的第 n n n个字符,这样的话我们的输出结果应该是0到9这是个数字之一。
  如果按照顺序一个一个查,这显然不是题目的本意。如果我们能够通过某种方法找到输入对应数字在哪个整数中,那我们就可以更方便地找到答案。因此观察:

[1,9]区间		1位数,一共有1*9=9个数字
[10,99]区间		2位数,一共有2*90=180个数字
[100,999]区间	3位数,一共有3*900=2700个数字
......

因此可以得到 i i i位数包含的数字个数为 i ∗ 9 ∗ 1 0 i − 1 i*9*10^{i-1} i910i1个,因此根据输入可以确定答案所在的数是几位数,以及是哪个数,再根据取余操作可以确定是这个数的第几个数字。

class Solution:
    def findNthDigit(self, n: int) -> int:
        i = 1
        while True:
            target = pow(10, i - 1)
            if i*9*target >= n:
                return int(str(target + (n-1)//i)[(n-1)%i])
            n -= i*9*target
            i += 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值