LeetCode 400. 第 N 位数字
Solution
首先找规律可以看出来每个位数\(digit\)的数字位数之和为\(sum_{digit}=digit*10^{digit-1}*9\),所以可以处理出第\(n\)位所在的数字\(value\),根据数字位数之和与\(n\)的关系,可以得出\(value\)的位数\(digit\),所以可以计算出\(digit-1\)以及之前的数位之和,根据\(digit\)位数又能确定出\(digit\)位数的最小值\(1\underbrace{0...00}_{digit-1}\),然后整除取余计算出答案。
思路1:模拟确定\(digit\)的值
思路2:二分确定\(digit\)的值 (见代码)
class Solution {
public int findNthDigit(int n) {
int l = 1, r = 9;
while (l < r) {
int mid = l + (r - l) / 2;
if (preSum(mid) < n) {
l = mid + 1;
} else {
r = mid;
}
}
int digit = l;
int begin = 1;
for (int i = 0; i < digit - 1; i++) {
begin *= 10;
}
int sufSum = n - preSum(digit - 1) - 1;
String value = String.valueOf(begin + sufSum / digit);
return value.charAt(sufSum % digit) - '0';
}
public int preSum(int length) {
int curLength = 1, sum = 0;
while (curLength <= length) {
sum += curLength * (int) Math.pow(10, curLength - 1) * 9;
curLength++;
}
return sum;
}
}
埋骨何须桑梓地,人生无处不青山