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)
        }
    }
}

results matching ""

    No results matching ""