难倒不是很难,就是很麻烦,像是数学的有序数列,需要找规律,考虑全面一些,差点儿给我逼疯了。。。
/**
* 给你一个整数 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 <= 231 - 1
*
* @param n
* @return
*/
public static int findNthDigit(int n) {
//几位数
long length = 1;
//一位数是9个,两位数是90个,三位数是900个......
long temp = 1;
long skipNum = 0;
if (n < 1 || n > Math.pow(2, 31) - 1) {
return -1;
}
if (n < 10) {
return n;
}
while (n > 9 * temp * length) {
n -= 9 * temp * length;
skipNum += 9 * temp;
temp *= 10;
length++;
}
long num = skipNum + n / length + (n % length == 0 ? 0 : 1);
int index = (int) (n % length == 0 ? length - 1 : (n % length) - 1);
String s = String.valueOf(String.valueOf(num).charAt(index));
return Integer.parseInt(s);
}