400. 第 N 位数字
第 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 <= 231 - 1
尝试做法
实话实说,差点题目没看懂,应该是找出1234567891011…的第n位数。
class Solution {
public int findNthDigit(int n) {
int times = 0, number = 1, used = 0;
while(times < n){
int temp = number;
used = number;
while(temp != 0){
temp /= 10;
++times;
}
++number;
}
while(times > n){
used /= 10;
--times;
}
return used % 10;
}
}
我先使用了一种时间复杂度较高的方法,一位位遍历,直到满足条件,但是会在大数时超出时间限制。
然后我想到,可以通过0-9,10-99,100-999时times每次增加的速度是不同,如果能判断出第n位数所在的那个序列数的范围,就可以将两层嵌套的while变为一层。但是降低的时间复杂度有限。
推荐做法
class Solution {
public int findNthDigit(int n) {
int len = 1;
while (len * 9 * Math.pow(10, len - 1) < n) {
n -= len * 9 * Math.pow(10, len - 1);
len++;
}
long s = (long) Math.pow(10, len - 1);
s += n / len - 1;
n -= len * (n / len);
return n == 0 ? (int) (s % 10) : (int) ((s + 1) / Math.pow(10, len - n) % 10);
}
}
作者:宫水三叶
链接:https://leetcode.cn/problems/nth-digit/solutions/1129553/gong-shui-san-xie-jian-dan-mo-ni-ti-by-a-w5wl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
len用于确定第n位数所在序列数的位数