400 第 N 位数字(数学)

44 篇文章 1 订阅

1. 问题描述:

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。注意:n 是正数且在 32 位整数范围内(n < 2 ^ 31)。

示例 1:

输入:3
输出:3

示例 2:

输入:11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit

2. 思路分析:

分析题目可以知道我们按位考虑即可,主要分为以下几个步骤解决问题:

1. 找到当前的第n位数字对应的是几位数

2. 找到几位数对应的是第几个数字

3. 找到对应数字的第几位

1~9          9 * 1个

10~99         90 * 2个

100~999         900 * 3....以此类推

对于第一个问题其实很简单,在循环中依次将n减去相应位数对应的数目即可,也即尝试减去 9 * 1, 90 * 2,...我们可以使用两个变量i,t分别记录当前位数对应的数字个数以及位数,也即对应上面的9,1这些。循环结束之后n剩下来为当前t位数字剩下来的个数,t记录的就是第n个数字对应的是几位数字。对于第二个问题我们可以使用n // t向上取整计算出对应几位数字的第几个数字。对于第三个问题我们计算出n % t - 1就是对应的是第几位数,余数为0表示最后一位数字,余数为1表示第n % t - 1位数字。

3. 代码如下:

class Solution:
    def findNthDigit(self, n: int) -> int:
        # 按位计算即可
        if n <= 9: return n
        i, t = 9, 1
        # 注意是i * t
        while n >= i * t:
            n -= i * t
            t += 1
            i = i * 10
        # t表示几位数, k表示的是第几个数字, n % t 的结果判断出是否需要向上取整
        # 从而计算出几位数字的第几个数字
        if n % t == 0:
            k = n // t
            # x为对应的那个数字
            x = 10 ** (t - 1) + (k - 1)
            # n % t为0表示的是最后一位数字
            return int(str(x)[-1])
        else:
            k = n // t + 1
            # 余数不为0说明n % t - 1表示的就是第几位数字了
            x = 10 ** (t - 1) + (k - 1)
            return int(str(x)[n % t - 1])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值