题目描述

image.png

解题思路

可以知道我们需要先求出这个n在哪几位数和哪几位数的区间中,因为不同位数占据的位也就不同。

  1. 将 101112⋯ 中的每一位称为 数位 ,记为 n ;
  2. 将 10, 11, 12,⋯ 称为 数字 ,记为 num ;
  3. 数字 10 是一个两位数,称此数字的 位数 为 2 ,记为 digit;
  4. 每 digit 位数的起始数字(即:1, 10, 100,⋯),记为 start;

image.png
观察上表,可推出各 digitdigit 下的数位数量 countcount 的计算公式:count=9×start×digit
此题解题分三个步骤:

  1. 求出在哪个区间,根据上面的推导可以使用while循环求出:

注意:n一定每次都需要减去count,这样才能知道n在这个区间的第多少位。

  1. int digit = 1; // 表示数字的位数
  2. long start = 1; // 表示开始的数组
  3. long count = 9; // 表示总共的位数
  4. while (n > count) {
  5. n -= count;
  6. digit += 1;
  7. start *= 10;
  8. count = 9 * digit * start;
  9. }
  1. 确定n所在的数字

怎么确定n所在的数字?可以把n - 1对当前的digit所占位数相除,因为在这个区间的每个数都是digit位,所以可以通过相除得出。

  1. 此时在哪个数确定好了,但是在这个数的第几位呢?因为这个区间的数右digit位,所以可以通过n - 1对digit取余得出第几位,在在第二步求出的数字上截取。

    1. class Solution {
    2. public int findNthDigit(int n) {
    3. int digit = 1; // 表示数字的位数
    4. long start = 1; // 表示开始的数组
    5. long count = 9; // 表示总共的位数
    6. while (n > count) {
    7. n -= count;
    8. digit += 1;
    9. start *= 10;
    10. count = 9 * digit * start;
    11. }
    12. // 此时n就是在区间内求取,n-1的原因是从0开始
    13. // 计算出在第多少个数
    14. long num = start + (n - 1) / digit;
    15. // 计算出在数的第几位
    16. return Long.toString(num).charAt((n - 1) % digit) - '0';
    17. }
    18. }