题目描述:在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
#方法1:直观方法,每枚举一个数字的时候,求出该数字是几位数,并把该数字的位数和前面所有数字的位数累加,
#如果位数之和《n,则继续枚举下一个数字,当累加的位数》=n,那第n位数字一定在这个数字里,我们再从该数字中找出对应的那一位。
#求正正数的位数
def countDigit(n):
if n==0:
return 1
c=0
while n:
n=n//10
c+=1
return c
def digitAtIndex(n):
if n<=9:
return n
c=0#c代表位数之和
for i in range(n):
c+=countDigit(i)
if c>=n:#当位数和》n时,
return str(i)[n-c]
digitAtIndex(1001)
import numpy as np
#方法2:
#m位数字共有几个数字
def countOfIntegers(digit):
if digit==1:
return 10
return 9*np.power(10,digit-1)
#m位数字的第一位数字,比如2位数字的第一位数字就是10,第一个三位数就是100
def beginnumber(digit):
if digit==1:
return 0
return np.power(10,digit-1)
#当我们知道要找的那一位数字位于某m位数字之中后,就可以用如下函数找出那一位数字:
def digitAtIndex2(index,digit):
number=beginnumber(digit)+index//digit
# indexFromRight=digits-index%digit
# for i in range(1,indexFromRight):
# number/=10
# return number%10
remainder=index%digit
return str(number)[remainder]
def digitAtIndex(index):
if index<0:
return -1
digit=1
while True:
number=countOfIntegers(digit)
if index<number*digit:
return digitAtIndex2(index,digit)
index-=digit*number
digit += 1
digitAtIndex(1001)