1. 数字序列中某一位的数字

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

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

  1. 示例 1
  2. 输入:n = 3
  3. 输出:3
  4. 示例 2
  5. 输入:n = 11
  6. 输出:0

思路:

  • 必须通过位数来分辨不同的区间
  • 步骤:
    1. 确定在某个区间
    2. 确定该区间的起始数
    3. 确定给定的数指向的是当前区间的哪个数
    4. 取余求得指向这个数的第几位
  • 要确定一个区间,必须求取每个区间对应多少位数,循环减去上一个区间的数,判断减去后的数是否小于下个区间数。
  • 这里区间开头的数 start = 10 * start(上个区间的开头,第一个区间的开头数为1)
  • 区间中数的总数 count = 9 start dight(位数)
    class Solution {
      public int findNthDigit(int n) {
          int dight = 1; // 记录位数
          long count = 9; // 当前区间中数的个数
          long start = 1; // 当前区间开始的数
          // 确定在那个区间
          while(n>count){
              n-=count;
              dight++;
              start*=10;
              count = 9*start*dight;
          }
          long num = start + (n-1)/dight; // 确定这个数
          return Long.toString(num).charAt((n-1)%dight)-'0';
      }
    }