20190626-剑指offer44-AcWing-57. 数字序列中某一位的数字

剑指offer44-AcWing-57. 数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。

在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。

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

样例

输入:13

输出:1

思路
    0-9有10个数,10-99,有90个数,100-999,有900个数…,按照这个顾虑先找属于哪一位,然后找属于是哪个数值的哪一位。
c++ code

class Solution {
public:
    int digitAtIndex(int n) {
        //digit表示数值的位数,base用来记录第digit位数的第一个数值
        long long digit = 1, digit_number = 9, base = 1;
        //while循环求出数值是属于第几位的
        //0-9有10个数,10-99,有90个数,100-999,有900个数......
        while(n > digit * digit_number) {   
            n -= digit * digit_number;        
            digit++;                
            digit_number *= 10;
            base *= 10;
        }
         //求具体是在哪个数值上
        int number = base + (n + digit - 1) / digit - 1; 
        //从右边开始是属于第几位上的
        int r = n % digit ? n % digit : digit;             
        for (int j = 0; j < digit - r; j++){
            number /= 10; 
        }
        return number % 10;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值