0
点赞
收藏
分享

微信扫一扫

LeetCode--字典序的第K小数字

扒皮狼 2022-03-23 阅读 86

题目链接

class Solution {
public: 
    int getSons(long cur, int n) {
        int sum = 0;
        int width = 1; 当前层的宽度
        while (1) {
            if (cur + width - 1 <= n) { //当前层最大值小于等于n
                sum += width; //总结点数可以加上当前层全部节点
                cur *= 10; //进入下一层
                width *= 10; //下一层宽度乘10倍
            } else {
                if (n >= cur) {  //此处cur有可能大于n,必须判断,比如n节点是cur父节点的右兄弟节点
                    sum += n - cur + 1;
                }
                break;
            }
        }

        return sum;
    }

    int findKthNumber(int n, int k) {
        int cnt = 0;
        long cur = 1;
        while (1) {
            if (cnt == k - 1) { //k节点前有k-1个节点,如果cnt == k - 1,说明当前cur即是第k个
                break;
            }
            int sons = getSons(cur, n);
            if (cnt + sons >= k) {
                cur *= 10;
                cnt++;
            } else {
                cnt += sons;
                cur++;
            }
        }

        return cur;
    }
};
举报

相关推荐

0 条评论