44:数字序列中某一位的数字(剑指offer第2版Python)LeetCode.400

1、题目描述

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

示例 1:

  • 输入:n = 3;输出:3

示例 2:

  • 输入:n = 11;输出:0

限制:0 <= n < 2^31

2、代码详解

class Solution(object):
    def findNthDigit(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 1)首先判断是几位数,用digits表示
        print('——————求第', n, '个数字——————')
        base = 9
        digits = 1
        while n - base * digits > 0:
            n -= base*digits
            base *= 10
            digits += 1
        # 此时,n 表示为digits位数的第n个位
        print('digits:', digits, 'n:', n)
        # 2)计算目标数字number
        idx = n % digits
        if idx == 0:
            idx = digits
        number = 1
        for i in range(1, digits):
            number *= 10

        if idx == digits:
            number += n//digits - 1
        else:
            number += n//digits

        print('number:', number, ',idx:', idx)

        # 3)找到number的对应位
        for i in range(idx, digits):
            number //= 10
        return number % 10

测试用例

s = Solution()
print(s.findNthDigit(364))
print(s.findNthDigit(365))
print(s.findNthDigit(366))
print(s.findNthDigit(11))
print(s.findNthDigit(12))

测试结果

——————求第 364 个数字——————
digits: 3 n: 175
number: 158 ,idx: 1
1
——————求第 365 个数字——————
digits: 3 n: 176
number: 158 ,idx: 2
5
——————求第 366 个数字——————
digits: 3 n: 177
number: 158 ,idx: 3
8
——————求第 11 个数字——————
digits: 2 n: 2
number: 10 ,idx: 2
0
——————求第 12 个数字——————
digits: 2 n: 3
number: 11 ,idx: 1
1

参考文献

https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solution/zhe-shi-yi-dao-shu-xue-ti-ge-zhao-gui-lu-by-z1m/

发布了184 篇原创文章 · 获赞 225 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/IOT_victor/article/details/104736227