440. 字典序的第K小数字

题面:

 

 题解:前缀10字典序比2小,因此这个类似于类似于求前缀和。函数getnum(pre,n)求前缀pre为根结点的前缀和的数量。pre=1开始,如果当前节点的子节点数量大于k则pre*=10,否则 pre++。

代码:

class Solution {
public:
    int getnum(long long pre, long long n)
    {
        int res = 0;
        long long ne = pre + 1;
        while(pre <= n)
        {
            res += min(n+1,ne) - pre;
            ne *= 10;
            pre *= 10;
        }
        return res;
    }
    int findKthNumber(int n, int k) {
            int pre=1;
            while(k)
            {
                int p = getnum(pre, n);
                if(p < k) 
                {
                     k -=p;
                     if(k == 0)
                    {
                    return pre;
                    }
                    pre ++;
                }
                else
                {
                    k--;
                     if(k == 0)
                    {
                    return pre;
                    }
                    pre *= 10;
                }
            }
            return 0;
    }
};

 

posted @ 2022-01-25 22:23  cumtljz  阅读(27)  评论(0编辑  收藏  举报