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 }

 

转载于:https://www.cnblogs.com/kexinxin/p/10269829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值