1. 题目描述

2. 我的解法
我的解法特别弱,就是遍历一遍字符串,用switch 分情况讨论,遇到特殊情况就多余一位判断
1 class Solution {2 public int romanToInt(String s) {3 int len = s.length();4 int sum = 0;5 for (int i=0;i<len;i++)6 {7 char c=s.charAt(i);8 switch(c)9 {10 case 'I': 11 if(i+1<len)12 {13 if(s.charAt(i+1)=='V')14 {sum+=4;15 i++;16 break;17 }18 else if(s.charAt(i+1)=='X')19 {20 sum+=9;21 i++;22 break;23 }24 }25 sum+=1;break;26 case 'V':sum+=5;break;27 case 'X':28 if(i+1<len)29 {30 if(s.charAt(i+1)=='L')31 {sum+=40;32 i++;33 break;34 }35 else if(s.charAt(i+1)=='C')36 {37 sum+=90;38 i++;39 break;40 }41 }42 sum+=10;break;43 case 'L':sum+=50;break;44 case 'C':45 if(i+1<len)46 {47 if(s.charAt(i+1)=='D')48 {sum+=400;49 i++;50 break;51 }52 else if(s.charAt(i+1)=='M')53 {54 sum+=900;55 i++;56 break;57 }58 }59 sum+=100;break;60 case 'D':sum+=500;break;61 case 'M':sum+=1000;break;62 }63 }64 return sum;65 }66}
3 解法二
别人的优雅的解法都是充分利用了罗马数字的特性。如IV=4,正常读=6 IX=9 正常读=11.正常读比正确读大2.所以提前-2。但是鉴于indexOf的效率O(nm),就是遍历查找,应该挺慢的
1 public int romanToInt(String s) {2 int sum=0;3 //提前减24 if(s.indexOf("IV")!=-1){sum-=2;}5 if(s.indexOf("IX")!=-1){sum-=2;}6 if(s.indexOf("XL")!=-1){sum-=20;}7 if(s.indexOf("XC")!=-1){sum-=20;}8 if(s.indexOf("CD")!=-1){sum-=200;}9 if(s.indexOf("CM")!=-1){sum-=200;}1011 char c[]=s.toCharArray();12 int count=0;1314 for(;count<=s.length()-1;count++){15 if(c[count]=='M') sum+=1000;16 if(c[count]=='D') sum+=500;17 if(c[count]=='C') sum+=100;18 if(c[count]=='L') sum+=50;19 if(c[count]=='X') sum+=10;20 if(c[count]=='V') sum+=5;21 if(c[count]=='I') sum+=1;2223 }2425 return sum;2627}
时间复杂度:O(n+6n2)==(13n)
解法一和解法二的时间截图

3.解法三
规律的第二中理解 IV=4。可以理解为-1+5=4。IX=9 可以理解为 -1+10=9其他的特殊情况亦然,这个比解法二块一些,还是比解法一慢 5ms,getVal部分换成map应该更快
1private int getVal(char c){2 switch (c){3 case 'M':4 return 1000;5 case 'D':6 return 500;7 case 'C':8 return 100;9 case 'L':10 return 50;11 case 'X' :12 return 10;13 case 'V':14 return 5;15 case 'I':16 return 1;17 }18 throw new IllegalArgumentException("unsupported character");19 }2021 public int romanToInt(String s) {22 int res = 0;23 if(s.length() == 0) return res;24 for (int i = 0; i < s.length() - 1; i++) {25 int cur = getVal(s.charAt(i));26 int nex = getVal(s.charAt(i+1));27 if(cur < nex){28 res -= cur;29 }else{30 res += cur;31 }32 }33 return res + getVal(s.charAt(s.length()-1));34 }



