题目描述
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位数字。
链接:https://leetcode-cn.com/problems/nth-digit/
1 <= n <= 231 - 1
分析
一道经典的数学急转弯题,我们先来算一下,位数为1,2,3…的数字总共有多少位
位数为1的有9个数字,共91=9位
位数为2的有90个数字,共902=180位
位数为3的有900个数字,共900*3=2700位
…
位数为n的有9 * 10n-1,那么其共有n * 9 * 10n-1个位
这里大致算了一下,根据n的范围,这个位数最大在10位左右,也就是说,我们可以在常数时间内找到这个数字的位数,怎么找呢,只要不断的用n去减掉位数为1,2,3…的总位数,直到减不掉为止,此时的位数就是所需要的位数了
然后此时递减后的n只要算出其所在数字和所在位数(分别用//和%得到)即可求得答案
代码
class Solution:
def findNthDigit(self, n: int) -> int:
temp=1
weishu=1
base=0
while 9*weishu*temp<n:
n-=9*temp*weishu
weishu+=1
base+=9*temp
temp*=10
number=n//weishu
pianyi=n%weishu
if pianyi ==0:
return int(str(number+base)[-1])
return int(str(number+base+1)[pianyi-1])