Giả sử bạn có một bộ các số nguyên. Có thể một số bộ sẽ chồng lấp (tức là các phần tử chia sẻ). Bạn có thể thoát khỏi sự chồng chéo bằng cách xóa các phần tử khỏi các tập hợp, nhưng sau đó một số trong số chúng có thể kết thúc trống; đó sẽ là một sự xấu hổ Chúng ta có thể làm cho tất cả các bộ tách rời nhau mà không làm trống bất kỳ bộ nào không?
Lưu ý rằng trong tình huống này, không bao giờ có bất kỳ lý do nào để để lại nhiều phần tử trong một tập hợp, vì vậy vấn đề này luôn có thể được giải quyết bằng cách giảm mỗi bộ thành chỉ một phần tử. Đó là phiên bản của vấn đề chúng tôi đang giải quyết ở đây.
Nhiệm vụ
Viết chương trình hoặc hàm, như sau:
Đầu vào : Một danh sách các bộ số nguyên.
Đầu ra : Một danh sách các số nguyên, có cùng độ dài với đầu vào, trong đó:
- Tất cả các số nguyên trong đầu ra là khác biệt; và
- Mỗi số nguyên trong đầu ra là một phần tử của tập hợp đầu vào tương ứng.
Làm rõ
- Bạn có thể biểu diễn một tập hợp dưới dạng danh sách nếu bạn muốn (hoặc bất cứ điều gì phù hợp với ngôn ngữ của bạn), bỏ qua thứ tự các yếu tố.
- Bạn không phải xử lý trường hợp không có giải pháp tồn tại (nghĩa là sẽ luôn có ít nhất một giải pháp).
- Có thể có nhiều hơn một giải pháp. Thuật toán của bạn phải luôn tạo ra một giải pháp hợp lệ, nhưng được phép không đặc biệt (nghĩa là nó ổn nếu nó chọn một giải pháp hợp lệ khác nhau mỗi lần nó chạy).
- Số lượng số nguyên riêng biệt xuất hiện trong đầu vào, n , sẽ bằng số lượng bộ trong đầu vào và để đơn giản, sẽ là các số nguyên từ 1 đến n bao gồm (vì giá trị thực của chúng không quan trọng). Tùy thuộc vào việc bạn có muốn khai thác sự thật này hay không.
Tủ thử
[{1,2},{1,3},{1,4},{3,4}] -> [2,3,1,4] or [2,1,4,3]
[{1,3},{1,2,4},{2,3},{3},{2,3,4,5}] -> [1,4,2,3,5]
[{1,3,4},{2,3,5},{1,2},{4,5},{4,5}] -> [1,3,2,4,5] or [3,2,1,4,5] or [1,3,2,5,4] or [3,2,1,5,4]
Điều kiện chiến thắng
Một chương trình đòi hỏi độ phức tạp thời gian tối ưu để giành chiến thắng, tức là nếu một thuật toán có độ phức tạp thời gian tốt hơn được tìm thấy, nó sẽ loại bỏ tất cả các mục chậm hơn. (Bạn có thể giả sử rằng các nội dung trong ngôn ngữ của bạn chạy càng nhanh càng tốt, ví dụ: bạn có thể giả sử rằng một nội dung sắp xếp chạy trong thời gian O (n log n). Tương tự, giả sử rằng tất cả các số nguyên có kích thước tương đương với n có thể được thêm, nhân, v.v. trong thời gian không đổi.)
Bởi vì độ phức tạp thời gian tối ưu có thể khá dễ dàng đạt được trong hầu hết các ngôn ngữ, do đó, người chiến thắng sẽ là chương trình ngắn nhất trong số những ngôn ngữ có độ phức tạp thời gian chiến thắng, được đo bằng byte.