LeetCode400. 第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,有1-9,为1*9=9个数位,
- 位数为2,有10-99,为2*90=180个数位,类似0-9要加上10
- 位数为3,有100-999,为3*900=2700个数为,
那我们可以发现,给一个数值n,我们可以判断这个n在哪个区间中,是1-9,10-99还是100-999等等 得到这个区间x,我们就可以确保n的数位是大于x-1区间的最大数位max的 然后n-max得到在当前区间x的数位y,这个区间x假设为3,其每个数字有3位 那么就用y/3得到数位在哪个数字上,然后y%3得到n的数位
算法代码
public int findNthDigit(int n) {
if (n <= 9) return n;
/*要记住传入的n是数位不是数字*/
int base = 1, weight = 9; //数位为1位的个数有9个
//不断用n减去个数为cnt的个数,当n小于这个区间的位数时,说明n数位就在这个区间
while (n > (long) base * weight) {
n -= base * weight;
base++; //更新数位为2位,3位...
weight *= 10; //更新2位的有90个数,3位的有900个数...
}
//退出循环,说明已经找到n数位的区间
n--; //下标要-1,相当于从0索引查找
//res为找到这个区间内n数位的数字不是数位
// Math.pow(10, base - 1):因为这个数是在当前base区间的,而我们是从base-1区间的最大值开始找的,所以n--
//n/base:找到这个区间的这个数,因为n已经发生了改变,为这个区间的第n个数位,除以对应的base数位得到数字
int res = (int) Math.pow(10, base - 1) + n / base;
int idx = n % base; //得到这个数字的第idx位
//转为字符串获取数位
return String.valueOf(res).charAt(idx) - '0';
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!