今天和大家聊的问题叫做 第 N 位数字,我们先来看题面:https://leetcode-cn.com/problems/nth-digit/
Given an integer n, return the nth digit of the infinite integer sequence [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...].
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。
示例
示例 1: 输入:3 输出:3 示例 2: 输入:11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
解题
观察数字规律可知:一位数共有:1*9 = 9*1*10^0两位数共有:2*90= 9*2*10^1三位数共有:3*900=9*3*10^2m 位数共有:9*m*10^{m-1}
由此可获得第 n 位数字属于哪个分段,即可知 m 的值。由 (n-1)//m 可获得第 n 位数字所属于数值,在该分段所有数值列表的下标。例如 3 在一位数分段的下标为 2;11 在两位数分段的下标为 0。分段的起始数值为 10^{m-1},则第 n 位数字所属数值为 num=10^{m-1}+(n-1)//m。第 n 位数字在数值 num 中的下标为 (n-1)\%m,由此可知第 n 位数字。
class Solution: def findNthDigit(self, n: int) -> int: m,stage=1,9 while n>stage: n=n-stage m=m+1 stage=9*m*(10**(m-1)) num=10**(m-1)+(n-1)//m index=(n-1)%m return int(str(num)[index])
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。