Integer to Roman

参考:http://www.cnblogs.com/reynold-lei/p/3385290.html

  http://www.cnblogs.com/feiling/p/3302242.html

罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。

  • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
  • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
  • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
  • 但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示。)
  • 左减数字必须为一位,比如8写成VIII,而非IIX。
  • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。

所以可能出现的数字只有: 1000(<4) M, 900(<2) CM, 500(<2) D, 400(<2) CD, 100(<4) C, 90(<2) XC, 50(<2) L, 40(<2) XL, 10(<4) X, 9(<2) IX, 5(<2) V, 4(<2) IV, 1(<4) I

只有M, C, X, I 可能出现多次。从左往右执行,则可得到答案。

public class Solution {
    public String intToRoman(int num) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        StringBuffer result = new StringBuffer();
        String[][] mapping = {
            {"", "M", "MM", "MMM", "", "", "", "", "", ""}, // 0 -3000
            {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, // 100 - 900
            {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, // 10 -90
            {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"} // 0- 9   
         };
         int scale = 1000;
         int i = 0;
         while(num > 0){
             int digit = num / scale;
             result.append(mapping[i++][digit]);
             num = num % scale;
             scale /= 10;
         }
         return result.toString();
        
    }
}
原文地址:https://www.cnblogs.com/RazerLu/p/3533074.html