Все задачи
Легко Решено: 0 Процент решений: 0%

Сортировка по выбранному ключу

Отсортируйте людей по имени или возрасту компаратором, выбранным во время выполнения, одинаково разрешая равенства.

Чему вы научитесь

  • Выбирать порядок сортировки во время выполнения
  • Разрешать равенства вторым ключом
  • Сравнивать строки порядково

Условие

В C# IComparer<T> — это интерфейс: любой класс, реализующий его метод Compare, может сказать сортировке, какой элемент идёт первым. Другой компаратор меняет порядок, не меняя саму сортировку.

Отсортируйте людей по key:

  • name: по имени (порядковое сравнение символов, поэтому заглавные буквы идут раньше строчных), а при равных именах — по возрасту.
  • age: по возрасту, сначала младшие, а при равном возрасте — по имени.

Реализуйте sort_by_key(names, ages, key).

Входные данные

names, ages: Люди (одинаковой длины).

key: "name" или "age".

Выходные данные

Верните имена в отсортированном порядке.

Ограничения

0 ≤ число людей ≤ 100,000

0 ≤ возраст ≤ 150

Примеры

Пример 1
Ввод:
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Ожидаемый вывод:
expected = ["Bo", "Lin", "Ada"]
Ввод:
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Ожидаемый вывод:
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
Ввод:
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Ожидаемый вывод:
string[] expected = new string[] {"Bo", "Lin", "Ada"};

Пояснение

Bo и Lin обоим по 30, поэтому они идут по имени раньше Ada (36): ["Bo", "Lin", "Ada"].

Пример 2
Ввод:
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Ожидаемый вывод:
expected = ["Ada", "Bo", "Lin"]
Ввод:
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Ожидаемый вывод:
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
Ввод:
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

Ожидаемый вывод:
string[] expected = new string[] {"Ada", "Bo", "Lin"};

Пояснение

Алфавитный порядок: ["Ada", "Bo", "Lin"].

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Сортируйте пары (name, age), а не два отдельных списка.

Подсказка 2

Выбранный ключ задаёт основной порядок, другое поле разрешает равенства.

Подсказка 3

Сравнивайте строки порядково, чтобы заглавные шли раньше строчных.

Ожидаемая сложность

время O(n log n), доп. память O(n)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.