12. Integer to Roman
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Solution
Background:
I: 1
V: 5
X: 10
L: 50
C: 100
D: 500
M: 1000
字母可以重复,但不超过三次,当需要超过三次时,用与下一位的组合表示:
I: 1, II: 2, III: 3, IV: 4
C: 100, CC: 200, CCC: 300, CD: 400
(1) Java
class Solution {
public String intToRoman(int num) {
if (num <= 0 || num > 3999) {
return "";
}
StringBuilder sb = new StringBuilder();
convert(num, sb, 1);
return sb.toString();
}
private void convert(int num, StringBuilder sb, int div) {
if (num == 0) {
return;
}
Map<Integer, String> map = new HashMap<>();
map.put(1, "I");
map.put(4, "IV");
map.put(5, "V");
map.put(9, "IX");
map.put(10, "X");
map.put(40, "XL");
map.put(50, "L");
map.put(90, "XC");
map.put(100, "C");
map.put(400, "CD");
map.put(500, "D");
map.put(900, "CM");
map.put(1000, "M");
int rem = num%10;
StringBuilder sb2 = new StringBuilder();
while(rem > 0) {
if (map.containsKey(rem*div)) {
sb2.insert(0, map.get(rem*div));
break;
}
sb2.insert(0, map.get(div));
rem--;
}
sb.insert(0, sb2.toString());
convert(num/10, sb, div*10);
}
}
(2) Python
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
if num <= 0 or num > 3999:
return ""
roms = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
rst = ""
for i in range(len(nums)):
while num >= nums[i]:
rst += roms[i]
num -= nums[i]
return rst
(3) Scala
object Solution {
def intToRoman(num: Int): String = {
if (num <= 0 || num > 3999) {
return ""
}
val roms = List(("M", 1000), ("CM", 900), ("D", 500), ("CD", 400), ("C", 100), ("XC", 90), ("L", 50), ("XL", 40), ("X", 10), ("IX", 9), ("V", 5), ("IV", 4), ("I", 1))
return convert(num, roms)
}
def convert(num: Int, roms: List[(String, Int)]): String = {
roms match {
case Nil => ""
case h :: t => h._1*(num/h._2) + convert(num%h._2, t)
}
}
}