Cho chuỗi alphanumeric s. Sắp xếp theo quy tắc:
- Chữ thường (lowercase) đứng trước, sắp xếp tăng dần.
- Chữ hoa (uppercase) đứng sau chữ thường, sắp xếp tăng dần.
- Chữ số (digits) đứng cuối, trong đó số lẻ đứng trước số chẵn, mỗi nhóm sắp xếp tăng dần.
Ví dụ: "HeLlo1234" → "eloHL1324".
Ý tưởng
Gán mỗi ký tự một khóa sắp xếp (sort key) sao cho thứ tự so sánh khóa phản ánh đúng quy tắc trên. Cụ thể:
- Chữ thường: khóa =
ASCII. - Chữ hoa: khóa =
10³ + ASCII. - Chữ số: khóa =
10⁶ + ASCII. - Nếu mã ASCII chẵn (tức số chẵn), cộng thêm
10⁹để đẩy số chẵn ra sau số lẻ.
Ví dụ mã nguồn
def f(c):
code = 0
if c.isupper():
code = 10 ** 3
elif c.isdigit():
code = 10 ** 6
if ord(c) % 2 == 0:
code = 10 ** 9
return code + ord(c)
def solve(s):
l = sorted(s, key=lambda c: f(c))
return ''.join(l)
s = "HeLlo1234"
print(solve(s)) # eloHL1324
Đầu vào / Đầu ra
Input: "HeLlo1234"
Output: eloHL1324