题目描述(简单难度)
题目描述:和上12题恰好相反,本题是将将罗马数字转换成阿拉伯数字。
解法一
其实这种解法具有先验知识。
如果我们输入的罗马数字没有特殊情况,就直接转换为对应的阿拉伯数字。
那么什么时候会出现特殊情况呢?
就是当4,9,40,90,400,900这几种情况出现时,要相对应减去一定的值,再按照正常的结果进行转换。
public class Roman_to_Integer {
public static int romantoint(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[] c=s.toCharArray();//字符串转换为数组
for(int count=0;count<=s.length()-1;count++) {
if(c[count]=='M') sum+=1000;
if(c[count]=='D') sum+=500;
if(c[count]=='C') sum+=100;
if(c[count]=='L') sum+=50;
if(c[count]=='X') sum+=10;
if(c[count]=='V') sum+=5;
if(c[count]=='I') sum+=1;
}
return sum;
}
public static void main(String srgs[]) {
String s="CDL";
int ans=romantoint(s);
System.out.println(ans);
}
}
时间复杂度:O(1)。
空间复杂度:O(1)。
解法二
利用到罗马数字的规则,一般情况是表示数字大的字母在前,数字小的字母在后,如果不是这样,就说明出现了特殊情况,此时应该做减法。
public class Roman_to_Integer2 {
public static int getval(char c) {
switch(c) {
case 'M':
return 1000;
case 'D':
return 500;
case 'C':
return 100;
case 'L':
return 50;
case 'X':
return 10;
case 'V':
return 5;
case 'I':
return 1;
}
throw new IllegalArgumentException("unsupported character");
}
public static int romantoint(String s) {
int res=0;
for(int i=0;i<s.length()-1;i++) {
int cur=getval(s.charAt(i));
int next=getval(s.charAt(i+1));
if(cur<next) {
res-=cur;
}else {
res+=cur;
}
}
return res+getval(s.charAt(s.length()-1));
}
public static void main(String args[]) {
String s="CDL";
int ans=romantoint(s);
System.out.println(ans);
}
}
时间复杂度:O(1)。
空间复杂度:O(1)。