400. 第 N 位数字

400. 第 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
  • 第​​n​​​ 位上的数字是按计数单位(digit)从前往后数的第​​n​​ 个数,参见示例 2

题解

思路:
先定位到哪个数i
i为w位数
n每次-w
i每次+1
退出循环的条件是n<=0
因为最后一次n-=w是负数
i多加了1
所以循环外i=i-1

n是负数对应的含义为
0是最后一位
-1是倒数第二位
依次

最后求出结果d
class Solution {
public int findNthDigit(int n) {
int i=1;
int w=1;
while(n>0){
if(i<Math.pow(10,w)){
n-=w;
}
i++;
if(i==Math.pow(10,w)){
w++;
}
}
i=i-1;
int d=i%10;
for(;n<=0;n++){
d=i%10;
i/=10;
}
return d;
}
}

400. 第 N 位数字【我亦无他唯手熟尔】_力扣算法

官方

方法二:直接计算

已知 x 位数共有9×10x−1个,所有 x 位数的位数之和是9×10 x−1。使用 d 和 count 分别表示当前遍历到的位数和当前位数下的所有整数的位数之和,初始时 d=1,count=9。每次将 n 减去 d d×count,然后将 d 加 1,将 count 乘以 10,直到 n≤d×count,此时的 d 是目标数字所在整数的位数,n 是所有 d 位数中从第一位到目标数字的位数。

为了方便计算目标数字,使用目标数字在所有 d 位数中的下标进行计算,下标从 0 开始计数。令
index=n−1,则 index 即为目标数字在所有 d 位数中的下标,index 的最小可能取值是 0。

得到下标index 之后,即可使用方法一的做法得到无限整数序列中的第 n 位数字。

class Solution {
public int findNthDigit(int n) {
int d = 1, count = 9;
while (n > (long) d * count) {
n -= d * count;
d++;
count *= 10;
}
int index = n - 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;
}
}

作者:LeetCode-Solution