- 第 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 的一部分。
内存超限
class Solution {
public int findNthDigit(int n) {
StringBuffer ans = new StringBuffer();
for(int i=1;i<=n;i++){
ans.append(i);
if(ans.length()>=n){
return ans.charAt(n-1)-'0';
}
}
return 0;
}
}
时间超限
class Solution {
public int findNthDigit(int n) {
int total=0;
for(int i=1;i<=n;i++){
String tem = String.valueOf(i);
total += tem.length();
if(total >=n){
return tem.charAt(tem.length() -1 - (total - n )) - '0';
}
}
return 0;
}
}
题解:
class Solution {
public int findNthDigit(int n) {
int low = 1, high = 9;
while (low < high) {
int mid = (high - low) / 2 + low;
if (totalDigits(mid) < n) {
low = mid + 1;
} else {
high = mid;
}
}
int d = low;
int prevDigits = totalDigits(d - 1);
int index = n - prevDigits - 1;
int start = (int) Math.pow(10, d - 1);
int num = start + index / d;
int digitIndex = index % d;
int digit = (num / (int) (Math.pow(10, d - digitIndex - 1))) % 10;
return digit;
}
public int totalDigits(int length) {
int digits = 0;
int curLength = 1, curCount = 9;
while (curLength <= length) {
digits += curLength * curCount;
curLength++;
curCount *= 10;
}
return digits;
}
}