思路
- 将字典序抽象成
字典树
(核心思想)
- 前序遍历找第K个节点 (核心思想)
- 通过
getSum()
来获取以当前节点为根节点下的所有节点数,若节点数小于k,证明要寻找的节点不在当前节点的子节点集合中,当前节点向右遍历一个节点即可,若节点数大于k,证明要寻找的数在子节点集合中,把当前节点跳到下一层开头即可
class Solution {
public:
int getSum(int cur,long n){
long first=cur,last=cur;
int sum=0;
while(first<=n){
sum+=min(n,last)-first+1;
first*=10;
last=last*10+9;
}
return sum;
}
int findKthNumber(int n, int k) {
int cur=1;
k--;
while(k>0){
int sum=getSum(cur,n);
if(sum<=k){
cur++;
k-=sum;
}else{
cur*=10;
k--;
}
}
return cur;
}
};