问题描述:
:罗马数字是由七个不同的符号来表示 I
,V
,X
,L
,C
,D
和M
。
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如,两个用II
罗马数字写成,只有两个加在一起。十二写为,XII
简称X
+ II
。数字二十七写为XXVII
,XX
+ V
+ II
。
罗马数字通常从左到右从最大到最小。但是,四个数字不是IIII
。相反,第四个被写为IV
。因为一个在五个之前,我们减去四个。同样的原则适用于编号为9的数字IX
。有六个使用减法的实例:
I
可以在V
(5)和X
(10)之前放置4和9。X
可以在L
(50)和C
(100)之前放置40和90。C
可以在D
(500)和M
(1000)之前放置以产生400和900。
给定罗马数字,将其转换为整数。输入保证在1到3999的范围内。
题解比较简单 直接代码搞定
public class Solution {
//判断输入字符是否合法
public boolean isExist(char c){
return c=='I'||c=='V'||c=='X'||c=='L'||c=='C'||c=='D'||c=='M';
}
public int romanToInt(String s) {
if(s==null||s=="") {
return -1;
}
Map<Character,Integer> mapping = new HashMap<Character, Integer>();
mapping.put('I',1);
mapping.put('V',5);
mapping.put('X',10);
mapping.put('L',50);
mapping.put('C',100);
mapping.put('D',500);
mapping.put('M',1000);
if(s.length()<2){
if(mapping.containsKey(s.charAt(0))){
return mapping.get(s.charAt(0));
}
return -1;
}
char[] c= s.toCharArray();
int sum = 0;
int preTemp=0;
int nextTemp=0;
for(int pre=0,next=1;next<c.length;){
if(!isExist(c[next])||!isExist(c[pre])){
return -1;
}
preTemp = mapping.get(c[pre]);
nextTemp = mapping.get(c[next]);
if(preTemp>=nextTemp){
sum+=preTemp;
if(next==c.length-1){
sum+=nextTemp;
}
pre++;
next++;
}else{
sum=sum+(nextTemp-preTemp);
if(next==c.length-2){
if(!isExist(c[++next])){
return -1;
}else{
sum+=mapping.get(c[next]);
}
}
pre+=2;
next+=2;
}
}
return sum;
}
下面附上大神代码 但是没有判断字符合法性 不过运行速度超快
class Solution {
public int romanToInt(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> mapping = new HashMap<>();
mapping.put('I', 1);
mapping.put('V', 5);
mapping.put('X', 10);
mapping.put('L', 50);
mapping.put('C', 100);
mapping.put('D', 500);
mapping.put('M', 1000);
int res = 0;
for (char c : s.toCharArray()) {
res += mapping.get(c);
}
if (s.indexOf("IV") != -1 || s.indexOf("IX") != -1) {
res -= 2;
}
if (s.indexOf("XL") != -1 || s.indexOf("XC") != -1) {
res -= 20;
}
if (s.indexOf("CD") != -1 || s.indexOf("CM") != -1) {
res -= 200;
}
return res;
}
}