Chuyển số nguyên sang La Mã (Integer to Roman)
12. Integer to Roman
Đề bài
Chữ số La Mã được biểu diễn bằng 7 ký hiệu:
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
Ví dụ:
2được viết làII(hai số 1).12được viết làXII(X + II).27được viết làXXVII(XX + V + II).
Thông thường, chữ số La Mã được viết từ trái qua phải theo thứ tự giảm dần. Tuy nhiên có các trường hợp đặc biệt dùng quy tắc “trừ”:
4không viết làIIIImà viết làIV(1 đứng trước 5 nghĩa là ).9viết làIX(10 - 1).
Cụ thể, chỉ có 6 trường hợp dùng phép trừ:
Iđặt trướcV(5) vàX(10) để tạoIV(4) vàIX(9).Xđặt trướcL(50) vàC(100) để tạoXL(40) vàXC(90).Cđặt trướcD(500) vàM(1000) để tạoCD(400) vàCM(900).
Cho một số nguyên num, hãy chuyển nó sang chữ số La Mã.
Ví dụ 1:
Input: num = 3 Output: "III"
Ví dụ 2:
Input: num = 4 Output: "IV"
Ví dụ 3:
Input: num = 9 Output: "IX"
Ví dụ 4:
Input: num = 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
Ví dụ 5:
Input: num = 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 và IV = 4.
Ràng buộc:
1 <= num <= 3999
Tóm tắt đề
Chuyển số nguyên num (1..3999) sang chuỗi chữ số La Mã theo các ký hiệu và quy tắc ở trên (có cả các cặp đặc biệt: IV, IX, XL, XC, CD, CM).
Ý tưởng
Dùng tham lam (greedy):
- Chuẩn bị 2 mảng
valuesvàsymbolsđã sắp xếp từ lớn đến nhỏ, bao gồm cả các trường hợp đặc biệt (1000, 900, 500, 400, ... , 4, 1). - Lặp cho tới khi
num = 0:- Chọn giá trị lớn nhất
values[i]sao chovalues[i] <= num. - Trừ
num -= values[i]và nốisymbols[i]vào kết quả.
- Chọn giá trị lớn nhất
Code
package leetcode func intToRoman(num int) string { values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1} symbols := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"} res, i := "", 0 for num != 0 { for values[i] > num { i++ } num -= values[i] res += symbols[i] } return res }