题目链接
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;
}
};