Todos los desafíos
Fácil 0 resueltos 0% de aceptación

Unir clientes y pedidos

Une los clientes con sus pedidos como un Join de LINQ e informa del gasto total de cada uno.

Lo que aprenderás

  • Unir dos colecciones por una clave común
  • Sumar valores por grupo
  • Ordenar por un valor y desempatar por nombre

Problema

Ver original (inglés)

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

Ejemplo 1
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"].

Ejemplo 2
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.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.