โจทย์: จัดเรียง Log files ให้ Letter-logs (มีตัวอักษร) อยู่หน้า Digit-logs (มีตัวเลข) Letter-logs เรียง Lexicographically โดยเนื้อหา (Content) ก่อน ตามด้วย Identifier หาก Content เหมือนกัน Digit-logs คงลำดับเดิม
Input/Output
Input: ["dig1 9 2 5 2", "let1 art can", "dig2 4 8", "let2 own kit dig", "let3 art zero"] Output: ["let1 art can", "let3 art zero", "let2 own kit dig", "dig1 9 2 5 2", "dig2 4 8"]
อัลกอริทึม
- แยก Logs เป็น 2 กลุ่ม: Letter-logs และ Digit-logs (เช็คคำที่ 2 ว่าเป็น Digit หรือไม่)
- Sort Letter-logs ด้วย Key: (Content, Identifier)
- รวม Letter-logs (เรียงแล้ว) + Digit-logs (ลำดับเดิม)
ตัวอย่างโค้ด
class Solution:
def reorderLogFiles(self, logs):
words = [] # Letter-logs: (identifier, content)
nums = [] # Digit-logs: original string
for log in logs:
parts = log.split()
if parts[1].isdigit():
nums.append(log)
else:
words.append((parts[0], ' '.join(parts[1:])))
# Sort by content, then by identifier
words.sort(key=lambda x: (x[1], x[0]))
words = [' '.join(w) for w in words]
return words + nums
ob = Solution()
print(ob.reorderLogFiles(["dig1 9 2 5 2", "let1 art can", "dig2 4 8", "let2 own kit dig", "let3 art zero"]))
ผลลัพธ์
['let1 art can', 'let3 art zero', 'let2 own kit dig', 'dig1 9 2 5 2', 'dig2 4 8']
Complexity: O(N log N) จากการ Sort, N = จำนวน Letter-logs