这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
400. 第 N 位数字
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。
注意:n 是正数且在 32 位整数范围内(n < 231)。
示例 1:
输入:3 输出:3 示例 2:
输入:11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分
解题思路
-
首先我们需要知道要找的那个第N位数字有是位于序列中的哪个元素。 1-9有1 * 9个数字, 10-99有2 * 90个数字, 100-999有3 * 900个数字。 通过这个规律我们就知道我们要找的数字具体属于哪个数的一部分。 例如输入的 n 是 11, 第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是具体是属于10的一部分。
-
再从序列元素中寻找对应的位 例如输入的 n 是 11: 第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...。上一步中就求出了我们的目标值位于序列元素10里面,元素10的前面有9个数字,而我们需要查找的目标是11,因此我们再从10里面,找出第(11-9)位(第二位)为0,所以我们找到的第N位就是0.
- num记录当前的数字
- dig记录位数,我们的数字是从一位数,二位数...这样递增的
- base代表当前位数拥有多少个数字,比如有9个个位数,90个二位数
因此我们只要不断地遍历一位数、二位数,找出我们目标位所在在数字为num 再计算出我们需要的目标位在num中的下标
代码
class Solution {
public int findNthDigit(int n) {
long base=9,dig=1;
int num=0;
while(n>base*dig)
{
n-=base*dig;
num+=base;
base*=10;
dig++;
}
num+=(n-1)/dig+1;
long idx=(n-1)%dig+1;
while(dig-->idx)
num/=10;
return num%10;
}
}