Welcome to Subscribe On Youtube
440. K-th Smallest in Lexicographical Order
Description
Given two integers n
and k
, return the kth
lexicographically smallest integer in the range [1, n]
.
Example 1:
Input: n = 13, k = 2 Output: 10 Explanation: The lexicographical order is [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9], so the second smallest number is 10.
Example 2:
Input: n = 1, k = 1 Output: 1
Constraints:
1 <= k <= n <= 109
Solutions
-
class Solution { private int n; public int findKthNumber(int n, int k) { this.n = n; long curr = 1; --k; while (k > 0) { int cnt = count(curr); if (k >= cnt) { k -= cnt; ++curr; } else { --k; curr *= 10; } } return (int) curr; } public int count(long curr) { long next = curr + 1; long cnt = 0; while (curr <= n) { cnt += Math.min(n - curr + 1, next - curr); next *= 10; curr *= 10; } return (int) cnt; } }
-
class Solution { public: int n; int findKthNumber(int n, int k) { this->n = n; --k; long long curr = 1; while (k) { int cnt = count(curr); if (k >= cnt) { k -= cnt; ++curr; } else { --k; curr *= 10; } } return (int) curr; } int count(long long curr) { long long next = curr + 1; int cnt = 0; while (curr <= n) { cnt += min(n - curr + 1, next - curr); next *= 10; curr *= 10; } return cnt; } };
-
class Solution: def findKthNumber(self, n: int, k: int) -> int: def count(curr): next, cnt = curr + 1, 0 while curr <= n: cnt += min(n - curr + 1, next - curr) next, curr = next * 10, curr * 10 return cnt curr = 1 k -= 1 while k: cnt = count(curr) if k >= cnt: k -= cnt curr += 1 else: k -= 1 curr *= 10 return curr
-
func findKthNumber(n int, k int) int { count := func(curr int) int { next := curr + 1 cnt := 0 for curr <= n { cnt += min(n-curr+1, next-curr) next *= 10 curr *= 10 } return cnt } curr := 1 k-- for k > 0 { cnt := count(curr) if k >= cnt { k -= cnt curr++ } else { k-- curr *= 10 } } return curr }