Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情
一、题目描述
给定整数n和k,求数字1到n中字典序第k小的数
数据范围
n <= 1e9
二、思路分析
采用字典树的思路,对于一个数字的字符串形式,从左往右推理,不断使其逼近第k小,如果当前前缀下的最末的节点仍小于k,说明当前的前缀不够,得继续扩大前缀;如果大于k,说明第k小的数就在当前的节点内,我们可以把前缀乘以10,进入子节点,继续一层层的判断。
三、AC代码
class Solution {
public:
long long js(long long n, long long pre) {
long long ans=0;
long long now = pre;
long long next = pre+1;
while (now <= n) {
if (next <= n) ans += next-now;
else ans += n-now+1;
now*=10;
next*=10;
}
return ans;
}
int findKthNumber(int n, int k) {
long long p=1;
long long ans=1;
while (p < k) {
int add = js(n, ans);
if (p+add <= k) {
ans++;
p+=add;
} else {
ans*=10;
p+=1;
}
}
return ans;
}
};
四、总结
利用字典树的性质,一层层纵向地、横向的逼近答案。