zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    2019.8.30 玉米田
    2019暑假集训 最短路计数
    2019暑假集训 旅行计划
    2019暑假集训 文件压缩
    0033-数字和星期转换
    0032-分数等级转换
    0031-闰年判断
    0030-购买衣服
    0029-求最小的数
    0028-判断奇偶
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10269829.html
Copyright © 2011-2022 走看看