思路:
1.得到某个前缀下面的节点数
2.如果之前遍历过的+当前前缀节点数大于k,向下走
3.如果之前遍历过的+当前前缀节点数小于k,向后走
class Solution {
public:
int getCount(int preix,long n){//得到前缀preix下的节点数(包含自身)
long cur=preix;
long next=preix+1;
int count=0;
while(cur<=n){//n有可能是整十倍,那么cur可能等于n,这里还有一个节点
count+=min(n+1,next)-cur;
cur*=10;
next*=10;
}
return count;
}
int findKthNumber(int n, int k) {
int p=1;//前面的总结点数,包含当前节点数
int preix=1;//当前指针所在的位置
while(p<k){//为定位到第k小的数
int count=getCount(preix,n);
if(p+count>k){//多了
preix*=10;
p++;
}
else if(p+count<=k){//不足或正好
preix++;
p+=count;
}
}
return preix;
}
};