剑指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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值