字典序第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 }