Массив «scores» показывает общее количество баллов для каждого участника конкурса. Так, например:
User A: 100 points
User B: 90 points
User C: 90 points
User D: 80 points
User E: 75 points
User F: 60 points
В соответствии с приведенными выше оценками у нас будет следующий рейтинг:
User A: #1
User B: #2
User C: #2
User D: #3
User E: #4
User F: #5
Этот метод ранжирования соответствует методу плотного ранжирования.
Тогда мы имеем пользователь по имени Алиса. Если она наберет 55 баллов, она займет шестую позицию (согласно рейтингу выше). Если она наберет 90 баллов, она займет позицию №2. И так далее.
На самом деле у меня есть массив, содержащий разные «сеансы» для Алисы. Так, например, имея: [55, 90]
Это означает, что в первый раз Алиса будет ранжирована на позицию №6. Во второй раз она займет позицию №2.
Я закодировал это, и это работает. Однако это не кажется очень эффективным. Для больших наборов данных, содержащих полмиллиона записей в массиве оценок, время ожидания истекает. Это код:
const getPosition = (element, scores) => {
scores.push(element);
scores.sort(function (a,b) { return b-a; });
return scores.indexOf(element)+1;
}
function climbingLeaderboard(scores, alice) {
var uniqueSet = new Set(scores);
scores = [...uniqueSet];
var positions = [];
let aliceIndex = 0;
while(aliceIndex < alice.length){
positions.push(getPosition(alice[aliceIndex], scores));
aliceIndex++;
}
return positions;
}
function main() {
const scores = [100, 90, 90, 80, 75, 60];
const alice = [50, 65, 77, 90, 102];
let result = climbingLeaderboard(scores, alice);
console.log(result.join("\n") + "\n");
}
Я полагаю, что проблема заключается в функции «сортировки» и / или поиске элемента в массиве с indexOf. Но я не мог найти способ сделать эти две операции более эффективными.