您的位置:首页 > 其它

leetcode_13. Roman to Integer

2018-03-06 18:29 363 查看
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应该是不允许的。
这个理解是否是对的,另外如果要优化代码,是否应该对这种情况加上校验?
希望有大神帮忙解答。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息