using ll=long long;
ll s[]={0,9,189,2889,38889,488889,5888889,68888889,788888889,8888888889,98888888889};
class Solution {
public:
ll get(int x)
{
string ss=to_string(x);
int len=ss.size();
ll res=s[len-1];
res+=len*(x-pow(10,len-1)+1);
return res;
}
int findNthDigit(int n) {
int l=1,r=1e9;
//找到最后一个小于n的字
while(l<r)
{
int mid=l+r+1>>1;
if(get(mid)<=n)l=mid;
else r=mid-1;
}
// cout<<l<<"\n";
int u=get(l);
string ss;
if(u==n){
ss=to_string(l);
return (ss[ss.size()-1]-'0');
}
ss=to_string(l+1);
return (ss[n-u-1]-'0');
}
};
n数据范围小的话可以直接暴力to_string(n<=1e4)
范围较大很容易想到打出长度小于i的数的位数的前缀和(方柏霓get求值)
找到第最后一个数位和小于等于n的数(等于的话就为二分出来的数的最后一位)
算出L(二分结果)之前的数位和与n做差(得k)即为答案在(L+1)的字符串的第k-1位