题目:

给定整数 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。

解答:

  1. var findKthNumber = function(n, k) {
  2. let getCount = (prefix, n) => {
  3. let cnt = 0;
  4. for (let cur = prefix, next = prefix + 1; cur <= n; cur *= 10, next *= 10) {
  5. cnt += Math.min(next, n + 1) - cur;
  6. // n = 13时,cnt = min(2, 14) - 1 + min(20, 14) - 10 = 5;
  7. }
  8. return cnt;
  9. }
  10. let p = 1;
  11. let prefix = 1;
  12. while (p < k) {
  13. let cnt = getCount(prefix, n); // 以prefix开头的数字数量
  14. if (p + cnt > k) {
  15. prefix *= 10; // 缩小范围
  16. p++; // p 往后移一位
  17. } else if (p + cnt <= k) {
  18. prefix++; // prefix + 1
  19. p += cnt; // p 跨越 cnt
  20. }
  21. }
  22. console.log(prefix);
  23. //return prefix;
  24. };
  25. n = 13; k = 2;
  26. findKthNumber(n, k);

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。