罗马数由七个数字组成:I, V, X, L, C, D,M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
2可以用II表示,即两个一一起。12写作XII,即X+II。27写作XXVII即XX+V+II.
罗马数一般从左到右由大到小,但是4并不是写作IIII而是IV,因为I写在V前面所以就是V-I等于4.以下是一些可以用的减法法则:
- I可以放在 V (5)和 X (10) 来表示4和9
- X可以放在L (50) 和C (100)来表示40和90
- C可以放在D (500)和M (1000)来表示400和900
题目:给出一个罗马数字,将其转换成整型(Integer),罗马数字的范围在1到3099之间。I-MMMIC
思路:先统计单个罗马数出现次数,每次出现加上其值。再查看特殊数字IV,IX,XL,XC,CD和CM是否出现,每次出现减去对应的I,X以及C的双倍值(统计的时候加了一次其代表的值,这里需要减去双倍)
代码:
Java
public static int solution(String s){
int sum=0;
//计算的时候会将被减去的数加回来,所以需要减去双倍的数
if(s.indexOf("IV") != -1){
sum-=2;
}
if(s.indexOf("IX") != -1){
sum-=2;
}
if(s.indexOf("XL") != -1){
sum-=20;
}
if(s.indexOf("XC") != -1){
sum-=20;
}
if(s.indexOf("CD") != -1){
sum-=200;
}
if(s.indexOf("CM") != -1){
sum-=200;
}
char[] nums=s.toCharArray();
for(int i=0;i<s.length();i++){
if(nums[i] == 'I'){
sum+=1;
}
if(nums[i] == 'V'){
sum+=5;
}
if(nums[i] == 'X'){
sum+=10;
}
if(nums[i] == 'L'){
sum+=50;
}
if(nums[i] == 'C'){
sum+=100;
}
if(nums[i] == 'D'){
sum+=500;
}
if(nums[i] == 'M'){
sum+=1000;
}
}
return sum;
}