剑指offer44:数字序列中某一位的数字

 题目描述:在无限的整数序列 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)
发布了86 篇原创文章 · 获赞 1 · 访问量 8238

猜你喜欢

转载自blog.csdn.net/a1272899331/article/details/104375750