Back to all solutions

#2343 - Query Kth Smallest Trimmed Number

Problem Description

You are given a 0-indexed array of strings nums, where each string is of equal length and consists of only digits.

You are also given a 0-indexed 2D integer array queries where queries[i] = [ki, trimi].

For each queries[i], you need to:

  • Trim each number in nums to its rightmost trimi digits.
  • Determine the index of the kith smallest trimmed number in nums. If two trimmed numbers are equal, the number with the lower index is considered to be smaller.
  • Reset each number in nums to its original length.

Return an array answer of the same length as queries, where answer[i] is the answer to the ith query.

Note:

  • To trim to the rightmost x digits means to keep removing the leftmost digit, until only x digits remain.
  • Strings in nums may contain leading zeros.

Solution

/**
 * @param {string[]} nums
 * @param {number[][]} queries
 * @return {number[]}
 */
var smallestTrimmedNumbers = function(nums, queries) {
  if (nums.length === 0) return [];

  const result = [];
  const stringLength = nums[0].length;
  let startIndex = 0;

  const maxHeap = new PriorityQueue((a, b) => {
    for (let i = startIndex; i < stringLength; i++) {
      if (nums[a].charAt(i) !== nums[b].charAt(i)) {
        return nums[b].charAt(i).charCodeAt(0) - nums[a].charAt(i).charCodeAt(0);
      }
    }
    return b - a;
  });

  for (let i = 0; i < queries.length; i++) {
    startIndex = stringLength - queries[i][1];
    maxHeap.clear();

    for (let j = 0; j < nums.length; j++) {
      maxHeap.enqueue(j);
      if (maxHeap.size() > queries[i][0]) {
        maxHeap.dequeue();
      }
    }

    result[i] = maxHeap.dequeue();
  }

  return result;
};