Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
附罗马换算算法
I | 1 | IV | 4 | V-I |
V | 5 | IX | 9 | X-I |
X | 10 | XL | 40 | L-X |
L | 50 | XC | 90 | C-X |
C | 100 | CD | 400 | D-C |
D | 500 | CM | 900 | M-C |
M | 1000 |
我的代码
public class Solution {
public int romanToInt(String s) {
int sum = 0;
for(int j = 0; j < s.length(); j++){
int number = s.charAt(j) - 'A';
if(number == 3){ //letter is 'D'
sum = sum + 500;
}
else if(number == 11){ //letter is 'L'
sum = sum + 50;
}
else if(number == 12){ //letter is 'M'
sum = sum + 1000;
}
else if(number == 21){ //letter is 'V'
sum = sum + 5;
}
else{
j++;
if(number == 2){ //letter is 'C'
if(j < s.length() && (s.charAt(j) - 'A') == 3){ //'CD'
sum = sum + 400;
}
else if(j < s.length() && (s.charAt(j) - 'A') == 12){ //'CM'
sum = sum + 900;
}
else{ //only 'C'
sum = sum + 100;
j--;
}
}
else if(number == 8){ //letter is 'I'
if(j < s.length() && (s.charAt(j) - 'A') == 21){ //'IV'
sum = sum + 4;
}
else if(j < s.length() && (s.charAt(j) - 'A') == 23){ //'IX'
sum = sum + 9;
}
else{ //only 'I'
sum = sum + 1;
j--;
}
}
else if(number == 23){ //letter is 'X'
if(j < s.length() && (s.charAt(j) - 'A') == 11){ //'XL'
sum = sum + 40;
}
else if(j < s.length() && (s.charAt(j) - 'A') == 2){ //'XC'
sum = sum + 90;
}
else{ //only 'X'
sum = sum + 10;
j--;
}
}
}
}
return sum;
}
}
应该还有更精炼的写法,没有看discuss
PS:时间复杂度上应该无法提升了,都是 O(n),遍历整个string