Roman与Integer之间的相互转换

罗马数字与阿拉伯数字之间的简单转换方法,首先需要了解罗马数字计数法,在这两道转换题里我们只用到了前三项规则

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

  2. 右加左减: 较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字; 较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字

  3. 左减有一定限制: 只有I, X, C可以放到左边当做减数使用,而且左减不能越位,I的右边只能是VX, X右边只能是LC, C的右边只能是DM; 左减数字必须为一位
  4. 其他规则: 加线乘千、重复数次、右加数字不可连续超过三位、同一数码最多只能连续出现三次

Roman to Integer

解题思路: 对于每一个roman字符,除了I,X,C三种情况会出现减去对应数值,其他情况都是加上该字符对应的数值; 针对I、X、C,我们可以总结发现只需要考察他们的下一位是否满足减的条件,是则减,否则加。

public class Solution {
    public int romanToInt(String s) {
        int res = 0;
        int len = s.length();
        for (int i=0; i<len; i++) {
            char tmp = s.charAt(i);
            switch (tmp) {
                case 'I':
                    if (i+1 <len && (s.charAt(i+1) == 'V' || s.charAt(i+1) == 'X')) {
                        res -= 1;
                        break;
                    }
                    res += 1;
                    break;
                case 'V':
                    res += 5;
                    break;
                case 'X':
                    if (i+1 <len && (s.charAt(i+1) == 'L' || s.charAt(i+1) == 'C')) {
                        res -= 10;
                        break;
                    }
                    res += 10;
                    break;
                case 'L':
                    res += 50;
                    break;
                case 'C':
                    if (i+1 <len && (s.charAt(i+1) == 'D' || s.charAt(i+1) == 'M')) {
                        res -= 100;
                        break;
                    }
                    res += 100;
                    break;
                case 'D':
                    res += 500;
                    break;
                case 'M':
                    res += 1000;
                    break;
                default:
                    break;
            }
        }
        return res;
    }
}

Integer To Roman

解题思路: 对于输入的数值进行取商处理,从大的计数单位到小的计数单位依次取商, 商则是该计数单位对应的roman字符的个数。

public class Solution {
    public String intToRoman(int num) {
        // igr存储的是从大到小每一个基本计数单位,与roman一一对应
        String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        int[] igr = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        StringBuilder res = new StringBuilder();
        for (int i=0; i<roman.length; i++) {
            int quotient = num / igr[i];
            for (int j=0; j<quotient; j++) {
                res.append(roman[i]);
            }
            num -= quotient * igr[i];
        }
        return res.toString();
    }
}