题目
题解
官方题解:字典序的第K小数字
刚开始试了试直接遍历放到字符串数组中,然后字典排序,然后根据下标取出第k小的字符串转为整形数据,由于 1 <= k <= n <= 109
很明显是超时的。
代码:
class Solution02 {
public int findKthNumber(int n, int k) {
String[] strs = new String[n];
for (int i = 1; i <= n; i++) {
strs[i-1] = String.valueOf(i);
}
Arrays.sort(strs);
return Integer.parseInt(strs[k]);
}
}
看题解用了字典树,字典树就是构建一颗树从而避免线性的遍历,然后根据先序遍历找到第k小的数,具体看题解。
class Solution {
public int findKthNumber(int n, int k) {
int cur = 1;
k--;
while (k > 0){
int step = getStep(cur,n);
if (step <= k){
k -= step;
cur++;
}else {
k--;
cur = cur * 10;
}
}
return cur;
}
int getStep(int cur,int n){
long l = cur;
long r = cur;
int step = 0;
while (l <= n){
step += Math.min(n,r) - l + 1;
l = l * 10;
r = r * 10 + 9;
}
return step;
}
}