0012. 整数转罗马数字

0012. 整数转罗马数字 #

  • 标签:贪心算法
  • 难度:中等

一、题目说明 #

描述:罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字2写做II,即为两个并列的I12写做XII,即为X+II27写做XXVII, 即为XX+V+II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:

  • I可以放在V(5) 和X(10) 的左边,来表示 4 和 9。

  • X可以放在L(50) 和C(100) 的左边,来表示 40 和 90。 

  • C可以放在D(500) 和M(1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例

  • 示例 1:
输入: num = 3
输出: "III"
  • 示例2:
输入: num = 4
输出: "IV"
  • 示例3:
输入: num = 9
输出: "IX"
  • 示例4:
输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
  • 示例5:
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示

  • $1 <= num <= 3999$

二、解题思路 #

1. 贪心算法 #

什么是贪心算法?

比如我们在超时购物,一共买了9块钱的商品,给了老板娘20块钱。正常情况下,如果有足够的钱,老板娘应该会找给我一张10元的,然后再给一张1元的。这样的话,只需要给我2张人民币即可。

这种思想就是贪心算法:每个阶段,尽量的多占用。

所以,过程就变成了:

public String intToRoman(int num) {
    Map<Integer, String> map = new LinkedHashMap<>();
    map.put(1000, "M");
    map.put(900, "CM");
    map.put(500, "D");
    map.put(400, "CD");
    map.put(100, "C");
    map.put(90, "XC");
    map.put(50, "L");
    map.put(40, "XL");
    map.put(10, "X");
    map.put(9, "IX");
    map.put(5, "V");
    map.put(4, "IV");
    map.put(1, "I");
    StringBuilder sb = new StringBuilder();
    for(Map.Entry<Integer, String> entry : map.entrySet()){
        int a = num / entry.getKey();
        while(a!=0){
            sb.append(entry.getValue());
            a--;
        }
        num = num % entry.getKey();
    }
    return sb.toString();
}