# Leetcode 2343
```java=
class Solution {
public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
int digits = nums[0].length();
int n = nums.length;
// Prepare for query answers.
int[] ans = new int[queries.length];
Map<Integer, List<Integer>> trimToIndex = new HashMap<>();
for (int i = 0; i < queries.length; i++) {
int trim = queries[i][1];
if (!trimToIndex.containsKey(trim)) {
trimToIndex.put(trim, new ArrayList<Integer>());
}
trimToIndex.get(trim).add(i);
}
// Prepare for the first pass.
List<List<Integer>> curBuckets = new ArrayList<>(10);
List<List<Integer>> nextBuckets = new ArrayList<>(10);
initList(curBuckets, 1);
initList(nextBuckets, 10);
for (int i = 0; i < n; i++) {
curBuckets.get(0).add(i);
}
for (int i = 1; i <= digits; i++) {
for (List<Integer> curBucket : curBuckets) {
for (int index : curBucket) {
String num = nums[index];
int d = num.charAt(digits - i) - '0';
nextBuckets.get(d).add(index);
}
}
// See if there's any queries asking for this trimming size.
if (trimToIndex.containsKey(i)) {
for (int qIndex : trimToIndex.get(i)) {
int kth = queries[qIndex][0];
ans[qIndex] = findKth(nextBuckets, kth - 1);
}
}
curBuckets = nextBuckets;
nextBuckets = new ArrayList<>(10);
initList(nextBuckets, 10);
}
return ans;
}
private void initList(List<List<Integer>> in, int size) {
for (int i = 0; i < size; i++) {
in.add(new ArrayList<>());
}
}
private int findKth(List<List<Integer>> buckets, int kth) {
int count = 0;
for (List<Integer> b : buckets) {
if (kth < count + b.size()) {
return b.get(kth - count);
}
count += b.size();
}
return 0;
}
}
```