当 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