Leetcode 440.字典序第k小的数字

字典序第k小的数字

给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。

注意:1 ≤ k ≤ n ≤ 109

示例 :

输入:

n: 13 k: 2

 

输出:

10

 

解释:

字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

 

思路

十叉树,比如10 ~ 20在这一层有10个数,如果20小于n,那么再找第三层100 ~ 200,每层step就min(n + 1, n2) - n1

 

 1 public class Solution {
 2     public int findKthNumber(int n, int k) {
 3         int cur = 1;
 4         int step;
 5         k--;
 6         while (k > 0) {
 7             step = calStep(n, cur, cur + 1);
 8             if (step <= k) {
 9                 k -= step;
10                 cur++;
11             } else {
12                 k--;
13                 cur *= 10;
14             }
15         }
16         return cur;
17     }
18     private int calStep(int n, long n1, long n2) {
19         int step = 0;
20         while (n1 <= n) {
21             step += Math.min(n + 1, n2) - n1;
22             n1 *= 10;
23             n2 *= 10;
24         }
25         return step;
26     }
27 }

 

posted on 2019-01-15 00:38  kexinxin  阅读(425)  评论(0编辑  收藏  举报

导航