剑指 Offer 44. 数字序列中某一位的数字-Python题解

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

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

示例 1:

输入:n = 3
输出:3
示例 2:

输入:n = 11
输出:0

限制:

0 <= n < 2^31

class Solution:
    def findNthDigit(self, n: int) -> int:
        # 个位为1,10位为2,依此类推
        digit = 1

        # 当前位数,数字的个数,
        # 个位,0-9,位数是从下表0开始计数,则0-9,9是第9位
        # 十位,10-99,一共是90*2,180个
        # 百位:100-999,一共是900*3,2700个
        # 可得到如下公式 9 * (10 ^digit -1)
        # 比如 1001, 1001-9-180=812
        # 812 < 2700 812 // 3 = 270,812%3=2,最后可得到 100+270=370,270的第二位,则第1001位既是7
        nums = self.get_nums(digit)
        while n >= nums:

            # 说明第n位在当前位数的数字中
            if n - nums < 0:
                break
            n = n - nums
            digit += 1
            nums = self.get_nums(digit)
        # 离当前位数开始位置的第几个数字
        cur_offset = n // digit
        # 在最后那个数字的第几位
        last_num_digit = n % digit
        # 最后的数字
        if digit > 1:
            last_num = pow(10, digit - 1) + cur_offset
        else:
            # 个位数的时候,是从0开始计数的
            last_num = 0 + cur_offset
        # 举例子,10,是个10位数,一共有两位,第0位是0,和第1位是1,但是实际在字符序列中,十位在前,个数在后,所以需要通过digit - last_num_digit - 1得到实际的位数
        return (last_num // pow(10, (digit - last_num_digit - 1)) )% 10
        
    def get_nums(self, digit):
        if digit == 1:
            return 9 + 1
        else:
            return 9 * pow(10, digit - 1) * digit
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值