Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Analysis:
According to the rules from wiki:
A number written in Arabic numerals can be broken into digits. For example, 1903 is composed of 1 (one thousand), 9 (nine hundreds), 0 (zero tens), and 3 (three units). To write the Roman numeral, each of the non-zero digits should be treated separately. In
the above example, 1,000 = M, 900 = CM, and 3 = III. Therefore, 1903 = MCMIII.[4]
The symbols "I", "X", "C", and "M" can be repeated three times in succession, but no more. (They may appear more than three times if they appear non-sequentially, such as XXXIX.) "D", "L", and "V" can never be repeated.[5][6]
"I" can be subtracted from "V" and "X" only. "X" can be subtracted from "L" and "C" only. "C" can be subtracted from "D" and "M" only. "V", "L", and "D" can never be subtracted[6]
Only one small-value symbol may be subtracted from any large-value symbol.[7]
The idea is to scan from left to right, if digit[current]>digit[current-1], add difference value to the result. else add digit[current] to the result
Java
public int RoToIn(char c){
switch(c){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
public int romanToInt(String s) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int result = 0;
for(int i=0; i<s.length(); i++){
if(i>0 && RoToIn(s.charAt(i))>RoToIn(s.charAt(i-1)))
result += RoToIn(s.charAt(i)) - 2*RoToIn(s.charAt(i-1));
else
result += RoToIn(s.charAt(i));
}
return result;
}c++
inline int c2n(char c){//inline function
switch(c){
case'I':return 1;
case'V':return 5;
case'X':return 10;
case'L':return 50;
case'C':return 100;
case'D':return 500;
case'M':return 1000;
default:return 0;
}
}
int romanToInt(string s) {
int result=0;
for(int i=0;i<s.size();i++){
if(i>0 && c2n(s[i])>c2n(s[i-1])){
result += (c2n(s[i])-2*c2n(s[i-1]));
}else{
result+=c2n(s[i]);
}
}
return result;
}

本文介绍了一种将罗马数字转换为整数的方法。通过扫描罗马数字字符串从左到右,如果当前字符对应的值大于前一个字符,则从结果中减去前一个字符的两倍值再加回当前值;否则直接累加当前字符的值。
1万+

被折叠的 条评论
为什么被折叠?



