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<int>(min(n+1LL, n2) - n1);
            n1 *= 10;
            n2 *= 10;
        }
        return steps;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容