Problema
El Join de LINQ empareja elementos de dos secuencias por una clave común, como un join de base de datos. Aquí los clientes se emparejan con sus pedidos por id de cliente.
El cliente i tiene id customer_ids[i] y nombre customer_names[i]. Cada pedido es [customer_id, amount].
Une ambas: para cada cliente con al menos un pedido, suma los importes de sus pedidos. Los clientes sin pedidos se dejan fuera y los pedidos con id desconocido se ignoran.
Implementa join_customers_orders(customer_ids, customer_names, orders).
Entrada
customer_ids, customer_names: Los clientes (los ids son distintos).
orders: Pares [customer_id, amount].
Salida
Devuelve "<name>:<total>" para cada cliente con pedidos, ordenados por total de mayor a menor y por nombre (orden ordinal) si empatan.
Restricciones
1 ≤ número de clientes ≤ 10,000
0 ≤ número de pedidos ≤ 100,000; 1 ≤ amount ≤ 10^6
Ejemplos
Entrada:
orders = [
[1, 50],
[2, 30],
[1, 20]
]
customer_ids = [1, 2, 3]
customer_names = ["Ada", "Lin", "Bo"]
Salida esperada:
expected = ["Ada:70", "Lin:30"]
Entrada:
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"};
Salida esperada:
std::vector<std::string> expected = {"Ada:70", "Lin:30"};
Entrada:
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"};
Salida esperada:
string[] expected = new string[] {"Ada:70", "Lin:30"};
Explicación
Ada tiene dos pedidos (50 + 20 = 70) y Lin uno (30); Bo no tiene ninguno y queda fuera: ["Ada:70", "Lin:30"].
Entrada:
orders = [
[8, 40],
[7, 40],
[9, 99]
]
customer_ids = [7, 8]
customer_names = ["Zoe", "Max"]
Salida esperada:
expected = ["Max:40", "Zoe:40"]
Entrada:
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"};
Salida esperada:
std::vector<std::string> expected = {"Max:40", "Zoe:40"};
Entrada:
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"};
Salida esperada:
string[] expected = new string[] {"Max:40", "Zoe:40"};
Explicación
Ambos suman 40, así que se ordenan por nombre; el pedido del id desconocido 9 se ignora: ["Max:40", "Zoe:40"].
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Primero suma los importes de los pedidos por id de cliente.
Pista 2
Luego recorre los clientes y quédate con los que tienen total.
Pista 3
Ordena por total descendente y luego por nombre en orden ordinal.
Complejidad esperada
tiempo O(n log n), espacio extra O(n)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.