【LeetCode 440】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

95 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情

一、题目描述

给定整数nk,求数字1n中字典序第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;
    }
};

四、总结

利用字典树的性质,一层层纵向地、横向的逼近答案。