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
解析原文在这, 大家自己看吧。基本能想到这种树状结构题就算是解开一半了, 另一半是相邻节点间步数的计算
impl Solution {
fn calcSteps(n: i64, mut n1: i64, mut n2: i64) -> i64 {
let mut steps = 0;
while n1 <= n {
steps += (n + 1).min(n2) - n1;
n1 *= 10;
n2 *= 10;
}
steps
}
pub fn find_kth_number(n: i32, k: i32) -> i32 {
let mut curr = 1;
let mut k = k as i64 - 1;
while k > 0 {
let steps = Solution::calcSteps(n as i64, curr, curr + 1);
if steps > k {
curr *= 10;
k -= 1;
continue;
}
curr += 1;
k -= steps;
}
curr as i32
}
}