b2c网站建设/搜狗搜索网页版
第 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位数所在序列数的位数