Вам дан целочисленный массив score размером n, где score[i] — это результат i-го спортсмена на соревновании. Все результаты гарантированно уникальны.
Спортсмены размещаются на основе своих результатов: спортсмен, занявший 1-е место, имеет наивысший результат, спортсмен, занявший 2-е место, имеет второй по величине результат и так далее. Размещение каждого спортсмена определяет его ранг:
Ранг спортсмена, занявшего 1-е место, — "Gold Medal".
Ранг спортсмена, занявшего 2-е место, — "Silver Medal".
Ранг спортсмена, занявшего 3-е место, — "Bronze Medal".
Для спортсменов, занявших с 4-го по n-е место, их ранг соответствует их номеру в размещении (т.е. ранг спортсмена, занявшего x-е место, — "x").
Верните массив answer размером n, где answer[i] — это ранг i-го спортсмена.
Пример:
Input: score = [5,4,3,2,1]
Output: ["Gold Medal","Silver Medal","Bronze Medal","4","5"]
Explanation: The placements are [1st, 2nd, 3rd, 4th, 5th].
C# решение
сопоставлено/оригиналpublic class Solution {
public string[] FindRelativeRanks(int[] score) {
int N = score.Length;
int maxScore = score.Max();
int[] scoreToIndex = new int[maxScore + 1];
for (int i = 0; i < N; i++) {
scoreToIndex[score[i]] = i + 1;
}
string[] rank = new string[N];
string[] MEDALS = { "Gold Medal", "Silver Medal", "Bronze Medal" };
int place = 1;
for (int i = maxScore; i >= 0; i--) {
if (scoreToIndex[i] != 0) {
int originalIndex = scoreToIndex[i] - 1;
rank[originalIndex] = place < 4 ? MEDALS[place - 1] : place.ToString();
place++;
}
}
return rank;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public vector<string> FindRelativeRanks(vector<int>& score) {
int N = score.size();
int maxScore = score.Max();
vector<int>& scoreToIndex = new int[maxScore + 1];
for (int i = 0; i < N; i++) {
scoreToIndex[score[i]] = i + 1;
}
vector<string> rank = new string[N];
vector<string> MEDALS = { "Gold Medal", "Silver Medal", "Bronze Medal" };
int place = 1;
for (int i = maxScore; i >= 0; i--) {
if (scoreToIndex[i] != 0) {
int originalIndex = scoreToIndex[i] - 1;
rank[originalIndex] = place < 4 ? MEDALS[place - 1] : place.ToString();
place++;
}
}
return rank;
}
}
Java решение
сопоставлено/оригиналclass Solution {
private int findMax(int[] score) {
int maxScore = 0;
for (int s : score) {
if (s > maxScore) {
maxScore = s;
}
}
return maxScore;
}
public String[] findRelativeRanks(int[] score) {
int N = score.length;
int M = findMax(score);
int[] scoreToIndex = new int[M + 1];
for (int i = 0; i < N; i++) {
scoreToIndex[score[i]] = i + 1;
}
final String[] MEDALS = {"Gold Medal", "Silver Medal", "Bronze Medal"};
String[] rank = new String[N];
int place = 1;
for (int i = M; i >= 0; i--) {
if (scoreToIndex[i] != 0) {
int originalIndex = scoreToIndex[i] - 1;
if (place < 4) {
rank[originalIndex] = MEDALS[place - 1];
} else {
rank[originalIndex] = String.valueOf(place);
}
place++;
}
}
return rank;
}
}
JavaScript решение
сопоставлено/оригиналvar findRelativeRanks = function(score) {
const N = score.length;
const maxScore = Math.max(...score);
const scoreToIndex = new Array(maxScore + 1).fill(0);
score.forEach((s, i) => {
scoreToIndex[s] = i + 1;
});
const MEDALS = ["Gold Medal", "Silver Medal", "Bronze Medal"];
const rank = new Array(N);
let place = 1;
for (let i = maxScore; i >= 0; i--) {
if (scoreToIndex[i] !== 0) {
const originalIndex = scoreToIndex[i] - 1;
rank[originalIndex] = place < 4 ? MEDALS[place - 1] : place.toString();
place++;
}
}
return rank;
};
Python решение
сопоставлено/оригиналclass Solution:
def findRelativeRanks(self, score: List[int]) -> List[str]:
N = len(score)
max_score = max(score)
score_to_index = [0] * (max_score + 1)
for i, s in enumerate(score):
score_to_index[s] = i + 1
MEDALS = ["Gold Medal", "Silver Medal", "Bronze Medal"]
rank = [""] * N
place = 1
for i in range(max_score, -1, -1):
if score_to_index[i] != 0:
original_index = score_to_index[i] - 1
if place < 4:
rank[original_index] = MEDALS[place - 1]
else:
rank[original_index] = str(place)
place += 1
return rank
Go решение
сопоставлено/оригиналfunc findRelativeRanks(score []int) []string {
N := len(score)
maxScore := 0
for _, s := range score {
if s > maxScore {
maxScore = s
}
}
scoreToIndex := make([]int, maxScore + 1)
for i, s := range score {
scoreToIndex[s] = i + 1
}
rank := make([]string, N)
medals := []string{"Gold Medal", "Silver Medal", "Bronze Medal"}
place := 1
for i := maxScore; i >= 0; i-- {
if scoreToIndex[i] != 0 {
originalIndex := scoreToIndex[i] - 1
if place < 4 {
rank[originalIndex] = medals[place - 1]
} else {
rank[originalIndex] = fmt.Sprintf("%d", place)
}
place++
}
}
return rank
}
Algorithm
Инициализация и нахождение максимального значения
Инициализируйте переменную N длиной массива score. Определите функцию findMax, которая находит максимальный балл в массиве score.
Создание вспомогательных структур
Инициализируйте массив scoreToIndex размером M + 1, где M — это максимальное значение в массиве score. Заполните scoreToIndex таким образом, чтобы для каждого score[i] его индекс сохранялся в scoreToIndex[score[i]].
Присваивание рангов и формирование ответа
Создайте массив rank для хранения рангов спортсменов. Используйте цикл для присваивания медалей и рангов в зависимости от значений в scoreToIndex, начиная с наибольшего.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.