题目:
440. 字典序的第K小数字
给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字。
示例 1:
输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
示例 2:
输入: n = 1, k = 1
输出: 1
提示:
1 <= k <= n <= 109
思路
看起来就是不太会,看了答案,搞清楚了
借用一张图
字典序的就是一位一位的比
比如图里的顺序: 1, 10,100,101,102, 11,12,19 只要同一位我比你大,我就是比你大,13大于129
构造出一棵树以后,就可以按照数量来取了
搞一个方法,计算出来某个前缀下面有多少个数(前提是这些数不能比n 大哦!)
然后从这个树尖开始 1, 向下找 k个数即可
满树 和 不满树 要判断一下
代码
public int getK(int n, int k) {
int p = 1;
int prefix = 1;
while (p < k) {
int count = getCount(n, prefix);
if (p + count > k) {
p++;
prefix*=10;// 这块卡住了.就是加一位的意思,就是这个前缀是对的,往后捋
} else {
prefix++;
p+=count;
}
}
return prefix;
}
private int getCount(int n, int prefix) {
long cur = prefix;// 这块要用long,防止int溢出
long next = cur + 1;// 这块要用long,防止int溢出
int count = 0;
while (cur <= n) {
count += Math.min(next, n+1) - cur;
cur *= 10;
next *= 10;
}
return count;
}
总结
不看答案很难做出来,那就多复习吧.勤能补拙,加油吧