Сливайте массивы с конца, каждый раз выбирая больший id. Остановитесь после k элементов или исчерпания обоих списков: полная сортировка не нужна.
Слияние двух массивов
Сливайте массивы с конца, каждый раз выбирая больший id. Остановитесь после k элементов или исчерпания обоих списков: полная сортировка не нужна.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Есть два сервиса которые возвращают список активных заявок на кредит отсортированных по возрастанию id, id - сквозное для обоих сервисов, необходимо получить список из k последних заявок на кредит:
const getDecisions1 = [
{id: 1, result: 'approved'},
{id: 3, result: 'waiting'},
{id: 15, result: 'approved'},
{id: 20, result: 'approved'},
{id: 26, result: 'waiting'},
{id: 30, result: 'approved'},
];
const getDecisions2 = [
{id: 2, result: 'approved'},
{id: 4, result: 'waiting'},
{id: 14, result: 'approved'},
{id: 16, result: 'approved'},
{id: 23, result: 'waiting'},
{id: 32, result: 'approved'},
];
const getLastDecision - (decision1, decision2, k) -> {
}
getLastDecision(getDecisions1.getDecisions2, 5) //
//[
// {id: 32, result: 'approved'},
// {id: 30, result: 'approved'},
// {id: 26, result: 'waiting'},
// {id: 23, result: 'waiting'},
// {id: 20, result: 'approved'}
Ответ
Сливайте массивы с конца, каждый раз выбирая больший id. Остановитесь после k элементов или исчерпания обоих списков: полная сортировка не нужна.
function getLastDecision(a, b, k) {
if (!Number.isInteger(k) || k < 0) throw new RangeError('Неверный k');
let i = a.length - 1, j = b.length - 1;
const result = [];
while (result.length < k && (i >= 0 || j >= 0)) {
if (j < 0 || (i >= 0 && a[i].id > b[j].id)) result.push(a[i--]);
else result.push(b[j--]);
}
return result;
}
Вызов должен быть getLastDecision(getDecisions1, getDecisions2, 5), результат — id 32,30,26,23,20. Предполагаются уникальные сквозные id и возрастание каждого входа; «последние» трактуются как наибольшие id. Время O(min(k,n+m)), память такого же порядка для результата. Входы не меняются.