剑指 Offer 44. 数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

思路:
m) 数字按照0123。。101112.。开始排序,第n位是什么:int最大是有10位数,去除0第一位,然后每一个不同区间开始都是1pow(10, digit-1) ,区间的位置最后都是9 pow(10, digit-1)*digit个,每次n都会减去前一段的,如果n< 当前区间的个数,就返回 字符串的对应位,n/digit(这个区间位数)+firstnum [ n%digit]-‘0’ ;

代码:

class Solution {
public:
    int findNthDigit(int n) {
         //第一步,获取n的是几位数的区间
         //去除第一个0 
         n-=1;
         //最多有10位数的
         for(int digit=1; digit<11; ++digit){
             long long firstNumPart=pow(10, digit-1);
             if( n< 9*firstNumPart*digit)   //将数字排开后,的该位下最后一个位置
                //找到了出现的区间了
                return  to_string(n/digit +firstNumPart)[n%digit]-'0';
             n-= 9*firstNumPart*digit;
             }
        return 0;
         }
     
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值