506. Relative Ranks

LeetCode easy оригинал: C# #array #csharp #easy #leetcode #search #string

Вам дан целочисленный массив 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, начиная с наибольшего.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.