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

1,538 阅读2分钟
  • 要求:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
  • 例如:输入n=3,输出3;输入n=11,输出0.
  • 思路:
  1. 101112中的每一位的数字称为位数,即第n位;
  2. 10,11,12称为数字,记为num;
  3. digit代表该数字是多少位数,1为1,15为2,103为3;
  4. start代表digit的起始数字,1位数起始数字为0,2位数起始数字为10,3位数起始数字为100...
数字范围 位数 数字数量 数位数量
1~9 1 9 9
10~99 2 90 180
100~999 3 900 2700
... ... ... ...
start~end digit 9×start 9×start×digit

位数递推公式 digit = digit + 1

起始数字递推公式 start = start × 10

数位数量计算公式 count = 9 × start × digit

  • 步骤:
  1. 确定n所在数字的位数,记为digit;

    循环执行n减去一位数、两位数...直至n<=count

  2. 确定n所在的数字,记为num;

    所求数位从数字start开始的第[(n-1)/digit]个数字中,因为有个0. num = start + (n-1)/digit;

  3. 确定n是num中的哪一位数,并返回结果。

    所求数位为数字num的第(n-1)%digit位,数字的首个数位为第0位。 s=str(num); res = int(s[(n-1)%digit]);代表num的 第 (n - 1) % digit 个数位,并转化为 int

  • 注意事项: n -= count;和n = n-count;输出的结果不太一样。前一个可以,后一个,即使用强制类型转换也无法通过编译,目前还不知道问题出在哪里。

  • 代码:
class Solution {
    public int findNthDigit(int n) {
        long digit = 1;
        long start = 1;
        long count = 9;
        long m = (long) n;
        while (m > count) { // 1.
            m = m - count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (m - 1) / digit; // 2.
        return (int)Long.toString(num).charAt((m - 1) % digit) - '0'; // 3.
    }
}