剑指offer:数字序列中某一位的数字-创新互联

题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。

创新互联专注于企业成都全网营销推广、网站重做改版、大通网站定制设计、自适应品牌网站建设、H5建站商城网站定制开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为大通等各大城市提供网站开发制作服务。
# -*- coding: utf-8 -*-
# @Time         : 2019-07-09 22:51
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : digitAtIndex.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

def countOfDigit(digit):
    return 9 * 10 ** (digit - 1) if digit > 1 else 10

def findDigitWithinRange(digit, index):
    if digit == 1:
        number = 0
    else:
        number = 10 ** (digit - 1)
    number += index // digit
    remainder = index % digit
    return str(number)[remainder]

def digitAtIndex(index):
    """
    最直观的做法就是从0开始遍历所有整数,然后统计已经出现了多少位数字,直到直到所求下标的数字。这样
    做的话效率太低。

    如果我们能先确定所求下标的数字是属于几位小数的,即先确定答案位于三位数还是四位数还是五位数的数
    字中,然后再在这个位数段中确定具体是哪个数字,最后在这个数字中确定是哪一位,这样就可以大大降低
    复杂度。
    """
    if index < 0:
        return -1
    # 所求的位置属于几位数,先从个位开始
    digit = 1
    while True:
        # 如果确定了所求位置属于几位数了,就进一步求具体的数字
        if index <= countOfDigit(digit):
            return findDigitWithinRange(digit, index)
        # 否则跳过这个n位数
        index -= countOfDigit(digit) * digit
        digit += 1

def main():
    print(digitAtIndex(21))

if __name__ == '__main__':
    main()

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

新闻标题:剑指offer:数字序列中某一位的数字-创新互联
文章转载:https://www.cdcxhl.com/article12/cccpdc.html

成都网站建设公司_创新互联,为您提供商城网站软件开发品牌网站建设域名注册微信小程序搜索引擎优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都seo排名网站优化