1. Description
Given two integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n.
2. Solution
求第k的数,也把前k-1的数字求出来,下一个数字就是答案。设当前数值curr为1,那么在[1,2)这个区间内可以产生多少个小于或等于n的数字呢?
设置一个循环,当k大于0时,
求出上述数字steps。
若steps小于或等于k,则k减去steps,curr加1。。
反之,只把当前的数字curr归为入不再考虑的队列,k减1,curr = curr*10.
结束循环,返回curr。
那么关键问题是怎么求在区间[curr,curr+1)中可以产生多少个小于或等于n的数字呢?
这里画个树图就明白了,懒得画了我。详见cal函数。
3. Code
int findKthNumber(int n, int k) {
int curr = 1;
k = k - 1;
while(k>0){
int steps = cal(n,curr,curr+1);
if(steps<=k){
curr++;
k -= steps;
}
else{
curr = curr * 10;
k--;
}
}
return curr;
}
int cal(long n, long n1,long n2){
int step = 0;
while(n1<=n){
step+= min(n+1,n2) - n1;
n1*=10;
n2*=10;
}
return step;
}