leetcode_13. Roman to Integer

1、算法题目

  要求将罗马数字转换为整数

2、罗马数字规则

罗马数字表示法基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:

  • 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
  • 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
  • 小的数字,在大的数字的左边,所表示的数等于大数减小数得到的数。如:Ⅳ= 4;Ⅸ= 9;
  • 左减的数字有限制,仅限于I、X、C。并且左减时不可跨越一个位数,如:99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1];
  • 正常使用时,连写的数字重复不得超过三次(IIII除外)。

3、实现

/**
 * 将罗马数字转换为整数
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    var romanToNum = {'I': 1, 'V':5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M':1000}, //各字符对应的数值
        charBefore = {'V':'I', 'X': 'I', 'L': 'X', 'C': 'X', 'D': 'C', 'M':'C'}; //各字符前面允许出现的字符
    var reatNum,
        c,
        result = 0,
        len = s.length;
    for(i = len - 1; i>=0; i--) {
        c = s[i];
        
        reatNum = (s[i] == s[i + 1]) ?  reatNum + 1 : 0;
        
        /*检测是否存在无效字符*/
        if(romanToNum[c] == undefined)  {
            result = 0;
            console.log('存在无效字符', i,c);
            break;
        }
        /*检测同一字符最多连续是否不大于三次(字符I不大于四次)*/
        if((c=='I' && reatNum > 4) || (c!='I' && reatNum > 3)) {
            result = 0;
            console.log('输入不符合要求,同一字符最多连续出现三次');
        }
    
        /*在遵循罗马数字规则下,如果当前字符小于其后的字符,那么应当减去该值*/
        if((i != len - 1) && charBefore[s[i+1]] == c) {
            result = result - romanToNum[c];
        } else {
            result = result + romanToNum[c];
        }
    }
    return result;
}; 

4、疑问

个人理解,罗马数字应该不能同位数的一直重复加,比如VIVII应该是不允许的。

这个理解是否是对的,另外如果要优化代码,是否应该对这种情况加上校验?

希望有大神帮忙解答。

猜你喜欢

转载自blog.csdn.net/c11073138/article/details/79450361