K-th Smallest in Lexicographical Order

题目来源
给两个数字n和k,求按字母序排列的第k个数字。

Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n.

然后我又弃疗了,看了答案,就是这么一个过程,先算一下cur和cur+1之间的距离,距离要是大于k的话,那么把cur10就可以,因为cur10肯定是下一个。
如果小于k的话,那么直接把cur+1,然后计算下cur和cur+1之间距离是多少。
计算cur和cur+1之间的距离的话,就是不断的把n1和n2乘10,然后判断当前层有多少个数字,假如是满的,那么就是n2-n1,如果不是满的,那么就是n+1-n1。
具体可以看看讨论区的解释。

class Solution {
public:
    int findKthNumber(int n, int k) {
        int cur = 1;
        k--;
        while (k > 0) {
            int steps = calSteps(n, cur, cur + 1);
            if (k >= steps) {
                k -= steps;
                cur = cur + 1;
            }
            else {
                cur *= 10;
                k--;
            }
        }
        return cur;
    }
    
    int calSteps(int n, long long n1, long long n2)
    {
        int steps = 0;
        while (n1 <= n) {
            steps += static_cast(min(n+1LL, n2) - n1);
            n1 *= 10;
            n2 *= 10;
        }
        return steps;
    }
};

你可能感兴趣的:(K-th Smallest in Lexicographical Order)