要求
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
核心代码
class Solution:
def findNthDigit(self, n: int) -> int:
flag,m = 9,9
i = 1
if n <= 9:
return n
while m < n:
i += 1
res = m
m += flag * 10 ** (i -1) * i
if (n - res) % i == 0:
return int(str(10 ** (i - 1) + (n - res) // i -1)[-1])
else:
return int(str(10 ** (i - 1) + (n - res) // i)[(n - res) % i - 1])
超时代码
class Solution:
def findNthDigit(self, n: int) -> int:
if n < 1:
return
res = [str(i) for i in range(1,n + 1)]
string = "".join(res)
res = list(string)
return int(res[n - 1])
解题思路:超时代码:思路较为简单但是会超时,我们将n个数变成字符串加到一起,然后取出这个字符串的第n个字符。核心代码:
- 先确定第n个数字所在的数字是几位数的:1-9 是一位数、10-99是两位数
(9+(99 - 10 + 1)* 2)… 以此类推、在代码中,可以计算出到第i位为止,共有多少位数字,如果大于n,说明n是在一个i位数中 - 在确定第n个数字在几位数的第几个数字的第几位即可,如n=15是2位数的第三个数字(12)的第二位,即第15个数字是2,
i表示第n个数字的位数,res表示前i-1位共有多少位数字,n-res表示i位数字有几位,(n-res)整除i确定n在第几个数字,n-res对i求余确定i在该数字的第几位
自我理解中:第一部分:从上面的while循环中我们能看到一个规律,就是2位数时候,我们加上的位数是(99-10+1)*2 = 90 * 2,就是3位数时候,我们加上的位数是(999-100+1)*3 = 900 * 3,所以提取到的就是
flag * 10 ** (i -1) * i,很简练的公式。第二部分:假设我们的数字是124,我们进入循环,i= 2,res=9,m =189>n,直接跳出循环,我们i表示当前是两位数,n(124) - res(9) = 115,减去1位的数字的占位,然后我们想要知道在第几个数字中,(n - res) // i 得到的是在的那位数字,(124 - 9)//2 = 57,假设(n - res) % i == 0,就是当前数字的最后一位,假设(n - res) % i != 0, 我们还要找出来他在的那个数字的第几位,这个就是对上面的红字部分的解读。