0<=n<=9时,这个题很简单,因为位置是对应的,问题就出在 后面的数字导致了位数的变化

那我们的核心观点就是,让这个位数 保持一致

后面的我们没法动,那最简单的方法就是,动前面的:

0|1|2|3|4|5|6|7|8|9|10

改成

00|01|02|03|04|05|06|07|08|09|10

此时,这个题就瞬间变的简单多了,这个时候,我们的总位数增加了10个(0-9),所以我们的目标位往后挪了10位

python实现

class Solution:
    def findNthDigit(self , n: int) -> int:
        i=1
        while i*(10**i) < n:
            n += 10**i  #为了补位,往后延申的长度
            i += 1     #位数+1
        # n//i 得出在哪个数字上, n%i得出在这个数字的哪一位
        return int(str(n//i)[n%i])  

c++实现

class Solution {
public:
    int findNthDigit(int n) {
        // write code here
        int i=1;
        while(i*(pow(10, i)) < n){
            n += pow(10, i);
            i++;
        }
        return to_string(n/i)[n%i] - '0';
    }
};

详细解释

举个例子:n=13

这个应该是数字11的第二个1(可以自己数数)

那么当位置往后挪了10个,我们目标就变成了:23 (13+10)

如果n是一个三位数,那么(00-99)都要在前面再加个0,变成(000-099),所以我们会再往后挪100(即10^2) 位

此时,我们已经可以通过除法,找到我们的目标数字

譬如刚才的例子:n=13,通过一个一个数,我们可以得知,是数字11的第二个1,但是当所有数字补齐位数之后,我们知道现在所有数字都是两位,23/2=11,我们通过当前位置/位数得到了目标数字target_num(其实就是所有数字位数都一样,整除一下位数,就可以知道是在第几个数)

然后我们再通过取模,知道是在target_num的哪位上,即num_place

注:

  • target_num = n//i
  • num_place = n%i