Given integers n
and k
, find the lexicographically k-th smallest integer in the range from 1
to n
.
Note: 1 ≤ k ≤ n ≤ 109.
Example:
Input: n: 13 k: 2 Output: 10 Explanation: The lexicographical order is [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9], so the second smallest number is 10.
分析: 依次逐渐确定前缀,每次计算当前前缀下不超过n的个数,若个数超过k,则说明第k个数在当前前缀下,反之,则说明在当前前缀加1以后的前缀;
以first为前缀的数
【first,first+1】
[first*10,(first+1)*10]
[first*100,(first+1)*100]
public class Solution {
public int findKthNumber(int n, int k) {
int ans=1;
for(k--;k>0;){
int count=0;
for(long first=ans,second=first+1;first<=n;first*=10,second*=10){
count+=Math.min(n+1,second)-first;
}
if(count<=k){
k-=count;
ans++;
}else{
k--;//减掉的是当前为前缀的那个数
ans*=10;元素个数太多,需要减小,因此前缀变大
}
}
return ans;
}
}