Tất cả thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Người đăng ký sự kiện

Gửi sự kiện tới những người đăng ký từng chủ đề theo kiểu observer và đếm số thông báo mỗi người nhận được.

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

  • Ánh xạ mỗi chủ đề tới những người theo dõi nó
  • Thông báo cho mọi người đăng ký của một sự kiện
  • Bỏ qua đăng ký trùng bằng set

Đề bài

Xem bản gốc (English)

Mẫu observer cho phép các đối tượng đăng ký theo dõi một chủ thể và được thông báo mỗi khi có chuyện xảy ra. Ở đây, mọi người đăng ký các chủ đề và mỗi sự kiện được phát sẽ tới tất cả những ai đăng ký chủ đề của nó.

Mỗi lượt đăng ký có dạng <person> <topic>. Đăng ký lặp lại không có thêm tác dụng. Sau đó, mỗi sự kiện trong events là một tên chủ đề: mọi người đăng ký chủ đề đó nhận một thông báo. Sự kiện thuộc chủ đề không ai theo dõi sẽ bị bỏ qua.

Hãy viết event_subscribers(subscriptions, events).

Đầu vào

subscriptions: Các chuỗi "<person> <topic>" (tên không chứa khoảng trắng).

events: Tên các chủ đề, theo thứ tự phát.

Đầu ra

Trả về "<person>:<count>" cho mỗi người có ít nhất một lượt đăng ký, sắp xếp theo tên (thứ tự ký tự ordinal).

Ràng buộc

1 ≤ số lượt đăng ký ≤ 10,000

0 ≤ số sự kiện ≤ 100,000

Ví dụ

Ví dụ 1
Đầu vào:
events = ["news", "sports", "weather"]
subscriptions = ["bob sports", "alice news", "alice sports"]

Kết quả mong đợi:
expected = ["alice:2", "bob:1"]
Đầu vào:
std::vector<std::string> events = {"news", "sports", "weather"};
std::vector<std::string> subscriptions = {"bob sports", "alice news", "alice sports"};

Kết quả mong đợi:
std::vector<std::string> expected = {"alice:2", "bob:1"};
Đầu vào:
string[] events = new string[] {"news", "sports", "weather"};
string[] subscriptions = new string[] {"bob sports", "alice news", "alice sports"};

Kết quả mong đợi:
string[] expected = new string[] {"alice:2", "bob:1"};

Giải thích

alice theo dõi news và sports nên nhận cả hai sự kiện; bob chỉ nhận sports; không ai theo dõi weather: ["alice:2", "bob:1"].

Ví dụ 2
Đầu vào:
events = []
subscriptions = ["zoe tech", "zoe tech"]

Kết quả mong đợi:
expected = ["zoe:0"]
Đầu vào:
std::vector<std::string> events = {};
std::vector<std::string> subscriptions = {"zoe tech", "zoe tech"};

Kết quả mong đợi:
std::vector<std::string> expected = {"zoe:0"};
Đầu vào:
string[] events = new string[] {};
string[] subscriptions = new string[] {"zoe tech", "zoe tech"};

Kết quả mong đợi:
string[] expected = new string[] {"zoe:0"};

Giải thích

Lượt đăng ký lặp lại chỉ tính một lần và không có sự kiện nào được phát: ["zoe:0"].

Hướng tiếp cận

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

Gợi ý 1

Nhóm người đăng ký theo chủ đề để mỗi sự kiện tìm đúng người nhận nhanh.

Gợi ý 2

Dùng một set cho mỗi chủ đề để đăng ký lặp lại chỉ tính một lần.

Gợi ý 3

Mọi người đã đăng ký đều có trong kết quả, kể cả khi nhận 0 thông báo.

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

thời gian O(số đăng ký + số sự kiện × số người theo dõi mỗi chủ đề), bộ nhớ phụ O(số đăng ký)

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.