Quay lại danh sách thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Ghép khách hàng và đơn hàng

Ghép khách hàng với đơn hàng giống LINQ Join và báo tổng chi tiêu của từng khách.

Bạn sẽ học được gì

  • Ghép hai collection theo một khóa chung
  • Cộng giá trị theo từng nhóm
  • Sắp theo giá trị và phân định hòa bằng tên

Đề bài

Xem bản gốc (English)

Join của LINQ ghép các phần tử từ hai dãy theo một khóa chung, giống phép join trong cơ sở dữ liệu. Ở đây khách hàng được ghép với đơn hàng theo mã khách hàng.

Khách hàng i có mã customer_ids[i] và tên customer_names[i]. Mỗi đơn hàng là [customer_id, amount].

Hãy ghép hai dãy: với mỗi khách có ít nhất một đơn, cộng số tiền các đơn của họ. Khách không có đơn bị bỏ qua, và đơn có mã khách hàng không tồn tại cũng bị bỏ qua.

Hãy viết join_customers_orders(customer_ids, customer_names, orders).

Đầu vào

customer_ids, customer_names: Các khách hàng (mã không trùng nhau).

orders: Các cặp [customer_id, amount].

Đầu ra

Trả về "<name>:<total>" cho mỗi khách có đơn, sắp theo tổng từ cao xuống thấp, và theo tên (thứ tự ordinal) khi tổng bằng nhau.

Ràng buộc

1 ≤ số khách hàng ≤ 10,000

0 ≤ số đơn hàng ≤ 100,000; 1 ≤ amount ≤ 10^6

Ví dụ

Ví dụ 1
Đầu vào:
orders = [
    [1, 50],
    [2, 30],
    [1, 20]
]
customer_ids = [1, 2, 3]
customer_names = ["Ada", "Lin", "Bo"]

Kết quả mong đợi:
expected = ["Ada:70", "Lin:30"]
Đầu vào:
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"};

Kết quả mong đợi:
std::vector<std::string> expected = {"Ada:70", "Lin:30"};
Đầu vào:
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"};

Kết quả mong đợi:
string[] expected = new string[] {"Ada:70", "Lin:30"};

Giải thích

Ada có hai đơn (50 + 20 = 70) và Lin một đơn (30); Bo không có đơn nên bị bỏ qua: ["Ada:70", "Lin:30"].

Ví dụ 2
Đầu vào:
orders = [
    [8, 40],
    [7, 40],
    [9, 99]
]
customer_ids = [7, 8]
customer_names = ["Zoe", "Max"]

Kết quả mong đợi:
expected = ["Max:40", "Zoe:40"]
Đầu vào:
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"};

Kết quả mong đợi:
std::vector<std::string> expected = {"Max:40", "Zoe:40"};
Đầu vào:
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"};

Kết quả mong đợi:
string[] expected = new string[] {"Max:40", "Zoe:40"};

Giải thích

Cả hai đều có tổng 40 nên xếp theo tên; đơn của mã 9 không tồn tại bị bỏ qua: ["Max:40", "Zoe:40"].

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

Trước tiên cộng số tiền đơn hàng theo từng mã khách hàng.

Gợi ý 2

Sau đó duyệt danh sách khách và giữ những người có tổng.

Gợi ý 3

Sắp theo tổng giảm dần, rồi theo tên theo thứ tự ordinal.

Độ phức tạp mong đợi

thời gian O(n log n), bộ nhớ phụ O(n)

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.