Join в LINQ сопоставляет элементы двух последовательностей по общему ключу, как соединение в базе данных. Здесь клиенты сопоставляются с заказами по идентификатору клиента.
У клиента i идентификатор customer_ids[i] и имя customer_names[i]. Каждый заказ — это [customer_id, amount].
Соедините их: для каждого клиента хотя бы с одним заказом сложите суммы его заказов. Клиенты без заказов не попадают в ответ, а заказы с неизвестным идентификатором игнорируются.
Реализуйте join_customers_orders(customer_ids, customer_names, orders).
Входные данные
customer_ids, customer_names: Клиенты (идентификаторы различны).
orders: Пары [customer_id, amount].
Выходные данные
Верните "<name>:<total>" для каждого клиента с заказами, отсортировав по сумме по убыванию, а при равных суммах — по имени (порядковое сравнение).
Ограничения
1 ≤ число клиентов ≤ 10,000
0 ≤ число заказов ≤ 100,000; 1 ≤ amount ≤ 10^6
Примеры
Ввод:
orders = [
[1, 50],
[2, 30],
[1, 20]
]
customer_ids = [1, 2, 3]
customer_names = ["Ada", "Lin", "Bo"]
Ожидаемый вывод:
expected = ["Ada:70", "Lin:30"]
Ввод:
std::vector<std::vector<long long>> orders = {
{1, 50},
{2, 30},
{1, 20}
};
std::vector<long long> customer_ids = {1, 2, 3};
std::vector<std::string> customer_names = {"Ada", "Lin", "Bo"};
Ожидаемый вывод:
std::vector<std::string> expected = {"Ada:70", "Lin:30"};
Ввод:
long[][] orders = new long[][] {
new long[] {1, 50},
new long[] {2, 30},
new long[] {1, 20}
};
long[] customer_ids = new long[] {1, 2, 3};
string[] customer_names = new string[] {"Ada", "Lin", "Bo"};
Ожидаемый вывод:
string[] expected = new string[] {"Ada:70", "Lin:30"};
Пояснение
У Ada два заказа (50 + 20 = 70), у Lin один (30); у Bo заказов нет, и он не попадает в ответ: ["Ada:70", "Lin:30"].
Ввод:
orders = [
[8, 40],
[7, 40],
[9, 99]
]
customer_ids = [7, 8]
customer_names = ["Zoe", "Max"]
Ожидаемый вывод:
expected = ["Max:40", "Zoe:40"]
Ввод:
std::vector<std::vector<long long>> orders = {
{8, 40},
{7, 40},
{9, 99}
};
std::vector<long long> customer_ids = {7, 8};
std::vector<std::string> customer_names = {"Zoe", "Max"};
Ожидаемый вывод:
std::vector<std::string> expected = {"Max:40", "Zoe:40"};
Ввод:
long[][] orders = new long[][] {
new long[] {8, 40},
new long[] {7, 40},
new long[] {9, 99}
};
long[] customer_ids = new long[] {7, 8};
string[] customer_names = new string[] {"Zoe", "Max"};
Ожидаемый вывод:
string[] expected = new string[] {"Max:40", "Zoe:40"};
Пояснение
У обоих по 40, поэтому они идут по имени; заказ с неизвестным идентификатором 9 игнорируется: ["Max:40", "Zoe:40"].
Как подступиться
Сначала попробуйте сами, затем открывайте подсказки по одной.
Подсказка 1
Сначала сложите суммы заказов по идентификатору клиента.
Подсказка 2
Затем пройдите по клиентам и оставьте тех, у кого есть сумма.
Подсказка 3
Отсортируйте по сумме по убыванию, затем по имени порядково.
Ожидаемая сложность
время O(n log n), доп. память O(n)
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.