其他分享
首页 > 其他分享> > 440. 字典序的第K小数字

440. 字典序的第K小数字

作者:互联网

 

难度困难

给定整数 n 和 k,返回  [1, n] 中字典序第 k 小的数字。

 

示例 1:

输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

示例 2:

输入: n = 1, k = 1
输出: 1

 

提示:

 

class Solution {
    // 根据 前缀 和 限制 n 查找该前缀下有多少可能值
    int getCnt(int x, int limit) {
        int ans = 0;
        string a = to_string(x), b = to_string(limit);
        int n = a.length(), m = b.length(), k = m - n;
        int u = stoi(b.substr(0, n));
        for (int i = 0; i < k; ++i) ans += pow(10, i);
        if (x < u) ans += pow(10, k);//3,239///1+10
        else if (x == u) ans += limit - x * pow(10, k) + 1;//23,239///1+(239-230+1)
        else if (x > u) ans += 0;//30,239///1 + 0;
        return ans;
    }
public:
    int findKthNumber(int n, int k) {
        int cnt = 1;
        int prefix = 1;
        while(cnt < k) {
            int count = getCnt(prefix, n);
            if (cnt + count > k) {
                /// 说明第k个数,在这个前缀范围里面,去子树寻找
                prefix *= 10;
                cnt++;
            } else if (cnt+count <= k) {
                /// 说明第k个数,不在这个前缀范围里面,前缀需要扩大+1
                prefix++;
                cnt += count;
            }
        }
        return prefix;
    }
};

 

标签:10,cnt,数字,int,pow,440,239,ans,字典
来源: https://www.cnblogs.com/zle1992/p/16350251.html