Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
这道题和12题正好相反,但是要比12题难一点。最重要的还是要熟悉对应表。
1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
1000~3000: {"M", "MM", "MMM"}.
我们可以发现所有这些罗马数字出现的字符有:I,V,X,L,C,D,M在满5和满9的时候回变化。除了满5和满9的位置,其他的罗马数字都是构成的几个字符的值相加之和,而满5满9的罗马数字则是两个字符构成,其整数值这两个字符代表的整数相加之和减去第一个字符对应整数值的两倍。另一个问题就是怎么知道是满5满9,通过找规律可以发现,每当满5满9时,两个字符总是后一个大于前一个。
java代码
public class Solution {
// 1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
// 10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
// 100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
// 1000~3000: {"M", "MM", "MMM"}.
public int romanToInt(String s) {
int result = getNumber(s.charAt(0));
for(int i=1;i<s.length();i++){
if(getNumber(s.charAt(i))>getNumber(s.charAt(i-1))){
result += getNumber(s.charAt(i))-2 * getNumber(s.charAt(i - 1));
}else{
result += getNumber(s.charAt(i));
}
}
return result;
}
public int getNumber(char c){
if (c=='I'){
return 1;
}else if(c == 'V'){
return 5;
}else if(c == 'X'){
return 10;
}else if(c == 'L'){
return 50;
}else if(c == 'C'){
return 100;
}else if(c == 'D'){
return 500;
}else{
return 1000;
}
}
}
go代码
func romanToInt(s string) int {
var result int = getNumber(s[0:1]);
var i int = 1
for ;i<len(s);i++{
if getNumber(s[i:i+1]) > getNumber(s[i-1:i]){
result += getNumber(s[i:i+1]) - 2*getNumber(s[i-1:i]);
}else{
result += getNumber(s[i:i+1]);
}
}
return result;
}
func getNumber(c string)int{
if c=="I"{
return 1;
}else if c == "V"{
return 5;
}else if c == "X"{
return 10;
}else if c == "L"{
return 50;
}else if c == "C"{
return 100;
}else if c == "D"{
return 500;
}else{
return 1000;
}
}