- 要求:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
- 例如:输入n=3,输出3;输入n=11,输出0.
- 思路:
- 101112中的每一位的数字称为位数,即第n位;
- 10,11,12称为数字,记为num;
- digit代表该数字是多少位数,1为1,15为2,103为3;
- 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
- 步骤:
-
确定n所在数字的位数,记为digit;
循环执行n减去一位数、两位数...直至n<=count
-
确定n所在的数字,记为num;
所求数位从数字start开始的第[(n-1)/digit]个数字中,因为有个0. num = start + (n-1)/digit;
-
确定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.
}
}