1. 问题描述:
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。注意:n 是正数且在 32 位整数范围内(n < 2 ^ 31)。
示例 1:
输入:3
输出:3
示例 2:
输入:11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
2. 思路分析:
分析题目可以知道我们按位考虑即可,主要分为以下几个步骤解决问题:
1. 找到当前的第n位数字对应的是几位数
2. 找到几位数对应的是第几个数字
3. 找到对应数字的第几位
1~9 9 * 1个
10~99 90 * 2个
100~999 900 * 3....以此类推
对于第一个问题其实很简单,在循环中依次将n减去相应位数对应的数目即可,也即尝试减去 9 * 1, 90 * 2,...我们可以使用两个变量i,t分别记录当前位数对应的数字个数以及位数,也即对应上面的9,1这些。循环结束之后n剩下来为当前t位数字剩下来的个数,t记录的就是第n个数字对应的是几位数字。对于第二个问题我们可以使用n // t向上取整计算出对应几位数字的第几个数字。对于第三个问题我们计算出n % t - 1就是对应的是第几位数,余数为0表示最后一位数字,余数为1表示第n % t - 1位数字。
3. 代码如下:
class Solution:
def findNthDigit(self, n: int) -> int:
# 按位计算即可
if n <= 9: return n
i, t = 9, 1
# 注意是i * t
while n >= i * t:
n -= i * t
t += 1
i = i * 10
# t表示几位数, k表示的是第几个数字, n % t 的结果判断出是否需要向上取整
# 从而计算出几位数字的第几个数字
if n % t == 0:
k = n // t
# x为对应的那个数字
x = 10 ** (t - 1) + (k - 1)
# n % t为0表示的是最后一位数字
return int(str(x)[-1])
else:
k = n // t + 1
# 余数不为0说明n % t - 1表示的就是第几位数字了
x = 10 ** (t - 1) + (k - 1)
return int(str(x)[n % t - 1])