字典序的第K小数字

 

 

 

 

代码:

class Solution {
public:
    long long get_prefix(long long prefix, long long n){
        long long x = prefix;
        long long y = prefix + 1;

        long long sum = 0;
        while(x <= n) {
            sum += min(n+1, y) - x;
            x *= 10;
            y *= 10;
        }
        return sum;
    }

    long long findKthNumber(int n, int k) {
        long long pos = 1; //指针所在的位置
        long long prefix = 1;

        while(pos < k) {
            long long num = get_prefix(prefix, n); //统计以prefix为前缀,小于等于 n 的所有数的和
            if (num + pos > k) {
                prefix *= 10;
                pos++; //此处相当于10叉树向下走一个位置,所以当前位置要加1
            }   
            else {
                pos += num;
                prefix++;
            }
            // printf("prefix = %d pos = %d \n", prefix, pos);
        }
        // int num = get_prefix(prefix, n);
        return prefix;
    }
};

 

posted @ 2021-11-05 22:30  楼主好菜啊  阅读(40)  评论(0编辑  收藏  举报