给定整数 n
和 k
,找到 1
到 n
中字典序第 k
小的数字。
注意:1 ≤ k ≤ n ≤ 109。
示例 :
输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
class Solution {
public:
int findKthNumber(int n, int k) {
long long prefix = 1;
long long p=1;
while(p<k){
int cnt = get_cnt(prefix,n);
if(p+cnt>k){
//说明以prefix开头的数字太多了,并且第k个数一定是以prefix开头的
prefix*=10;
p++;
}
else{
//说明把所有的以prefix开头的数字全部添加进去都不够
//前缀prefix要加1
//p要更新
prefix++;
p+=cnt;
}
}
return prefix;
}
//prefix 为 数字n的前缀 比如n = 1234 prefix = 1
//以数字 prefix 开头的所有数字串 按字典序一定 排在以数字 prefix+1 开头的所有数字串的前面
long long get_cnt(long long prefix, long long n){
long long cnt = 0;
for(long long a = prefix,b = prefix+1;a<=n;a*=10,b*=10){
cnt += min(n+1,b)-a;
}
return cnt;
}
};