1

将罗马数字转化为十进制数字

Leetcode上的一道简单级别的题目
将罗马数字转化为对应的十进制数字,其中罗马数字的范围在1~3999

这题的关键在于了解需求,及如何将罗马数字转化为对应的十进制数字

罗马数字转化为十进制数字的规则为:

  1. 用作数字的罗马字母共有七个,即Ⅰ(1),Ⅴ(5),Ⅹ(10),L(50),C(100),D(500),M(1000).

  2. 相同的数字连写,所表示的数等于这些数相加

  3. 如果大的数字在前,小的数字在后,所表示的数等于这些数相加 如:VIII = 8,

  4. 如果小的数字在前,大的数字在后,所表示的数等于从大数减去小数。如:IX = 9

我的解答中使用了类似于链表的方法
创建两个变量current和next分别表示当前节点和下一个节点,当当前节点和下一个节点的值不同时,则将当前temp中的值根据比较结果添加至result,并赋值temp为下一个节点的值,否则将值累加至temp
为了比较方便,我在输入的string最后添加了一个‘O’其对应的值为0

/**
 * @author rale
 *
 *Given a roman numeral, convert it to an integer.
 *Input is guaranteed to be within the range from 1 to 3999.
 *
 */
public class RomanToInteger {
    public int romanToInt(String s) {
        //将两个if判断删去后测试得到的结果性能更好 可能和测试用例有关
        if(s==null || s.equals("")){
            return 0;
        }
        if(s.length()==1){
            return singleRomanToInt(s.charAt(0));
        }
        s += 'O';
        int result = 0;
        char[] romanChars = s.toCharArray();
        char current = romanChars[0];
        char next = romanChars[1];
        int temp = singleRomanToInt(current);
        for(int i = 0 ; i<romanChars.length-1 ; i++){
            current = romanChars[i];
            next = romanChars[i+1];
            int currentInt = singleRomanToInt(current);
            int nextInt = singleRomanToInt(next);
            if(currentInt==nextInt){
                temp += nextInt;
            }else if(currentInt<nextInt){
                result -= temp;
                temp = nextInt;
            }else if(currentInt>nextInt){
                result += temp;
                temp = nextInt;
            }
        }
        return result;
    }
    
    //将单个罗马字母转化为对应的数字
    private int singleRomanToInt(char s){
        int result = 0;
        switch(s){
        case 'I' : 
            result = 1;
            break;
        case 'V' :
            result = 5;
            break;
        case 'X' :
            result = 10;
            break;
        case 'L' :
            result = 50;
            break;
        case 'C' :
            result = 100;
            break;
        case 'D' :
            result = 500;
            break;
        case 'M' :
            result = 1000;
            break;
        default :
            result = 0;
            break;
        }
    return result;
    }
    
    
}

raledong
2.7k 声望2k 粉丝

心怀远方,负重前行