第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 stb = new StringBuffer();
stb.append("123456789");
int num = 10;
while (stb.length() < n) {
stb.append(num);
++num;
}
int res = (int) stb.charAt(n-1) - 48;
return res;
}
}
问题:
将数字序列转为字符串,在第100000000位数字之后,超出题目内存限制
官方代码(官方题解):
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) {
//计算所有位数不超过d-1的整数的位数之和
int digits = 0;
int curLength = 1, curCount = 9;
while (curLength <= length) {
digits += curLength * curCount;
curLength++;
//到下一位数整数,加一位
curCount *= 10;
}
return digits;
}
}
提示:
- 1 <= n <= 231 - 1
- 第 n 位上的数字是按计数单位(digit)从前往后数的第 n 个数,参见 示例 2 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。