44 数字序列中某一位的数字

题目

数字以01234567891011121314...的格式排列。在这个序列中,第5位(从0开始计)是5,第13位是1,第19位是4。求任意第n为对应的数字。

AcWing OJ

C++ 题解

从位数为1开始统计不同的位数的数字所占的总位数,如09一共占10位,1099一共占180位…并进行累加,一旦累加的和超过给定的位数,可以找到目标数字的一个大概范围,再进一步进行分析。
需要一点注意int类型会溢出(比如,pow(10,11)就溢出了)需要定义为更大的类型。

class Solution {
public:
    int digitAtIndex(int n) {
        // i表示是几位数:1,2,3...
        // s表示位数共有多少个: 1位数9个(先忽略0),2位数90个,3位数900 个
        // base:表示几位数的基数,1位数是1,2位数是10,3位数是100
         long long i = 1, s = 9, base = 1;
         while(n > i * s)  
         {   
             n -= i * s;         // 1000 - 9 - 90 * 2 - 900 * 3 ...
             i ++;                
             s *= 10;
             base *= 10;
         }
         
         
         // number 表示的是数字是多少,因为从0开始,所以减去一个1
         // (n + i - 1) / i  向上取整
         long long number = base + (n + i - 1) / i - 1; 
         // r 表示是该数字的第几位,除不尽就是那一位,除尽就是最后一位
         long long r = n % i ? n % i : i;  
         // 除到所求数字的那一位
         for (int j = 0; j < i - r; j ++) 
			number /= 10; 

         // 返回对10取余的结果
         return number % 10;
    }
};

python 题解

class Solution(object):
    def digitAtIndex(self, n):
        i = 1; s = 9
        while n > s * i:
            n -= s * i
            s *= 10
            i += 1
        res = 10 ** (i - 1) + n / i - 1
        if n % i == 0:
            res = str(res)[-1] 
        else:
            res = str(res + 1)[n % i - 1]
        return res
posted @ 2019-03-16 15:31  youngliu91  阅读(209)  评论(0编辑  收藏  举报