K-th Smallest in Lexicographical Order

HardTrie

Solution

export function findKthNumber(n: number, k: number): number {
  let num = 1;
  let remain = k - 1;
  while (0 < remain) {
    const steps = countSteps(n, num, num + 1);
    if (steps <= remain) {
      num += 1;
      remain -= steps;
    } else {
      num *= 10;
      remain -= 1;
    }
  }
  return num;
}
 
function countSteps(n: number, prefix1: number, prefix2: number) {
  let steps = 0;
  while (prefix1 <= n) {
    steps += Math.min(n + 1, prefix2) - prefix1;
    prefix1 *= 10;
    prefix2 *= 10;
  }
  return steps;
}

Complexity

  • Time: O(log(N^2))
  • Space: O(logN)