【剑指offer】【数学】44. 数字序列中某一位的数字

题目链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/

数学

  1. 先确定第n位所在的数字是几位数; n - 10 - 90 * 2 - 900 * 3 - 9000 * 4 ...
  2. 确定第n位是几位数的第几个数(哪个数);
  3. 确定属于这个数的第几位。
class Solution {
public:
    int digitAtIndex(int n) {
        n++; //题目中是从0开始,我们从1开始计数
        n--; //因为个位有10个,为了统一成 9 90 900 ,n--
        //确定是第n位所在数字是几位数
        // n - 10 - 90 * 2 - 900 * 3 - 9000 * 4 ...
        //i表示几位数 n表示这位数有多少个 base表示这位数的第一个数是什么
        long long i = 1, s = 9, base = 1;
        while(n > i * s)
        {
            n -= i *s;
            i ++;
            s *= 10;
            base *= 10; 
        }
        //确定是几位数的第几个数
        //例:4位数的第256个数: 1000 + 256 - 1 = 1255 n就属于1255中某一位
        //number表示第n位数属于哪个数
        // 向上取整 n / i == 向下取整 (n + i - 1) / i
        int number = base + (n + i - 1) / i - 1;
        
        //确定属于这个数的第几位
        //余0 最后一位
        int r = n % i ? n % i : i;
        for(int j = 0; j < i - r; j++) number /= 10;
        return number % 10;
    }
};
posted @ 2020-05-04 10:37  NaughtyCoder  阅读(111)  评论(0)    收藏  举报