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

Sắp xếp theo khóa được chọn

Sắp xếp mọi người theo tên hoặc theo tuổi bằng một comparer được chọn khi chạy, đồng thời phá vỡ các trường hợp bằng nhau một cách nhất quán.

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

  • Chọn thứ tự sắp xếp lúc chạy
  • Phân định hòa bằng khóa thứ hai
  • So sánh chuỗi theo thứ tự ordinal

Đề bài

Xem bản gốc (English)

Trong C#, một IComparer<T> là một interface: bất kỳ lớp nào triển khai phương thức Compare của nó đều có thể cho biết phần tử nào đứng trước trong một lần sắp xếp. Việc chọn một comparer khác sẽ thay đổi thứ tự mà không cần thay đổi cách sắp xếp.

Sắp xếp mọi người theo key:

  • name: theo tên (thứ tự ký tự ordinal, vì vậy chữ in hoa đứng trước chữ in thường), và theo tuổi khi tên giống nhau.
  • age: theo tuổi, người trẻ hơn đứng trước, và theo tên khi tuổi giống nhau.

Hãy triển khai sort_by_key(names, ages, key).

Đầu vào

names, ages: Những người (cùng độ dài).

key: "name" hoặc "age".

Đầu ra

Trả về các tên theo thứ tự đã sắp xếp.

Ràng buộc

0 ≤ số người ≤ 100,000

0 ≤ tuổi ≤ 150

Ví dụ

Ví dụ 1
Đầu vào:
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Kết quả mong đợi:
expected = ["Bo", "Lin", "Ada"]
Đầu vào:
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Kết quả mong đợi:
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
Đầu vào:
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

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

Giải thích

Bo và Lin đều 30 tuổi, nên chúng được sắp xếp theo tên trước Ada (36): ["Bo", "Lin", "Ada"].

Ví dụ 2
Đầu vào:
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]

Kết quả mong đợi:
expected = ["Ada", "Bo", "Lin"]
Đầu vào:
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};

Kết quả mong đợi:
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
Đầu vào:
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};

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

Giải thích

Thứ tự theo bảng chữ cái: ["Ada", "Bo", "Lin"].

Hướng tiếp cận

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

Gợi ý 1

Sắp xếp các cặp (name, age) thay vì hai danh sách riêng.

Gợi ý 2

Khóa được chọn quyết định thứ tự chính; trường còn lại phân định hòa.

Gợi ý 3

Dùng so sánh chuỗi ordinal để chữ hoa đứng trước chữ thường.

Độ 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.