版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/88830498
原题
Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …
Note:
n is positive and will fit within the range of a 32-bit signed integer (n < 231).
Example 1:
Input:
3
Output:
3
Example 2:
Input:
11
Output:
0
Explanation:
The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … is a 0, which is part of the number 10.
解法
按层次累加. 设i为i位数, 那么有以下规律
i = 1: 1, 2, ...9
i = 2: 10, 11, ...99
i = 3: 100, 101, ..., 999
我们先确定n在哪一层, 然后确定n离那一层第一个数的距离, 以确定n所在的数字, 使用divmod()方法确定n离当前层的第一个数的距离和它的index. 返回数字对应的index即可.
代码
class Solution(object):
def findNthDigit(self, n):
"""
:type n: int
:rtype: int
"""
def totalDigits(i):
# return the total digits of i-digit number
start = 10**(i-1)
end = 10**i-1
return (end-start+1)*i
i = 1
total = 0
prev_total = 0
# find the level of the digit that n belongs
while True:
total += totalDigits(i)
if n <= total:
break
else:
i += 1
prev_total = total
# find the distance from the first number of the level
distance = n - prev_total-1
div, mod = divmod(distance, i)
num = 10**(i-1) + div
return int(str(num)[mod])