Todos os desafios
Fácil 0 resolvidos 0% de aceitação

Ordenar por uma chave escolhida

Ordene pessoas por nome ou por idade com um comparador escolhido em tempo de execução, quebrando empates de forma consistente.

O que você vai aprender

  • Escolher a ordem em tempo de execução
  • Desempatar com uma segunda chave
  • Comparar strings em ordem ordinal

Problema

Ver original (inglês)

Em C#, um IComparer<T> é uma interface: qualquer classe que implemente seu método Compare pode dizer a uma ordenação qual item vem primeiro. Escolher um comparador diferente muda a ordem sem mudar a ordenação.

Ordene as pessoas por key:

  • name: por nome (ordem ordinal de caracteres, então letras maiúsculas vêm antes de minúsculas), e por idade quando os nomes forem iguais.
  • age: por idade, do mais novo para o mais velho, e por nome quando as idades forem iguais.

Implemente sort_by_key(names, ages, key).

Input

names, ages: As pessoas (mesmo tamanho).

key: "name" ou "age".

Output

Retorne os nomes em ordem ordenada.

Restrições

0 ≤ número de pessoas ≤ 100,000

0 ≤ idade ≤ 150

Exemplos

Exemplo 1
Entrada:
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Saída esperada:
expected = ["Bo", "Lin", "Ada"]
Entrada:
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Saída esperada:
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
Entrada:
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Saída esperada:
string[] expected = new string[] {"Bo", "Lin", "Ada"};

Explicação

Bo e Lin têm ambos 30, então são ordenados por nome antes de Ada (36): ["Bo", "Lin", "Ada"].

Exemplo 2
Entrada:
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Saída esperada:
expected = ["Ada", "Bo", "Lin"]
Entrada:
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Saída esperada:
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
Entrada:
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Saída esperada:
string[] expected = new string[] {"Ada", "Bo", "Lin"};

Explicação

Ordem alfabética: ["Ada", "Bo", "Lin"].

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Ordene pares (name, age) em vez de duas listas separadas.

Dica 2

A chave escolhida define a ordem principal; o outro campo desempata.

Dica 3

Compare strings em ordem ordinal para que as maiúsculas venham antes das minúsculas.

Complexidade esperada

tempo O(n log n), espaço extra O(n)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.