题目:
给你一个整数 n
,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
中找出并返回第 n
位上的数字。
解题
解法:模拟
1~9 | 有 9 个 | 有9 * 1 位数 |
10~99 | 有 9 * 10 个 | 有9 * 10 * 2 位数 |
100~999 | 有 9 * 100个 | 有9 * 100 * 3 位数 |
求第n位数 |
int findNthDigit(int n) {
long base = 1;
int bit = 1;
while (n > 9 * base * bit)
{
n -= 9 * base * bit;
base *= 10;
bit ++;
}
// 每个数bit 就是位数,所求处在base ~ base*10-1
// 第几个数就是 剩下的(n-1) / bit + base 因为是从base开始的,前面没有=号 所以-1
long val = base + (n - 1)/bit;
// 数中的第几位 (n-1) % bit
int index = (n - 1) % bit;
return to_string(val)[index] - '0';
}
复杂度
- 时间:O(近似log10(n)?)
- 空间:O(1)