题目描述
- 第 N 位数字
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。
提示:
1 <= n <= 2^31 - 1
第 n 位上的数字是按计数单位(digit)从前往后数的第 n 个数,参见 示例 2 。
思路
- 纯暴力循环去解 => 超时(真实
- 先依据位数的规律去确定结果所在的大致范围
然后通过之前除去的范围(sum)+ n / 位数
来确定该数的大小 , 通过n % 位数
来确定结果是该数中的第几位。
【PS】范围在确定的时候用long
去存储 ,不然会超整形 (比如这样 (doge)
代码
class Solution {
public int findNthDigit(int n) {
if (n < 10){
return n;
}
int sum = 0;
long h = 9;
int cnt = 1;
while (true) {
n -= h * cnt;
sum += h;
if (h * 10 * (++cnt) >= n){
break;
}
h *= 10;
}
int res;
if (n % cnt == 0){
res = sum + n / cnt;
return Integer.parseInt(new StringBuilder("" + res).reverse().substring(0,1));
}else {
res = sum + n / cnt + 1;
return Integer.parseInt(Integer.toString(res).substring(n % cnt - 1,n % cnt));
}
}
}