Я работаю с этой проблемой: https://www.hackerrank.com/challenges/fraudulent-activity-notifications/
Мой код работает почти нормально, но в некоторых тестовых случаях он не работает из-за большого массива (более 200000 элементов).Я трачу часы, пытаясь понять, что я могу сделать, чтобы улучшить скорость, но я не могу найти рабочее решение, поэтому 2 из моих тестов всегда терпят неудачу по таймауту, и я разочарован, пытаясь пройти этот тест.Я думаю, что не могу избежать первого цикла, а также цикла в сортировке, но не могу придумать более быстрый путь.
Проблема, описанная на сайте, заключается в следующем:
Национальный банк HackerLand имеетпростая политика для предупреждения клиентов о возможной мошеннической деятельности аккаунта.Если сумма, потраченная клиентом в определенный день, больше или равна средним расходам клиента за последние дни, они отправляют клиенту уведомление о возможном мошенничестве.Банк не отправляет клиенту никаких уведомлений до тех пор, пока у него не будет хотя бы того конечного числа данных транзакций предыдущих дней.
Я решил это с помощью этого кода
function getMedianNumber(arr) {
arr.sort((a, b) => a - b);
let medianNumber = 0;
const middle = Math.floor(arr.length / 2);
if (arr.length % 2 === 0) {
// Is even we get the median number
medianNumber = (arr[middle] + arr[middle - 1]) / 2;
} else {
const index = Math.floor(middle);
medianNumber = arr[index];
}
return medianNumber;
}
function activityNotifications(expenditure, d) {
let notifications = 0;
let len = expenditure.length - 1;
for (let i = len; i > d - 1; i--) {
let trailingDays = expenditure.slice(i - d, i);
let dayExpense = expenditure[i];
let median = getMedianNumber(trailingDays);
if (expenditure[i] >= median * 2) {
notifications++;
}
}
return notifications;
}
Он не работает только в2 теста, потому что переданный массив огромен, и я получаю ошибку тайм-аута.