修改了对比前后数字的方法,没必要把数组传过去,按题意也不会出现多次,while换成if
结果:5ms 40.2M
import java.util.HashMap; import java.util.Map; /** * @Author:lixici * @Date:2020/9/2 21:42 */ public class RomanToInteger2 { public int getValue(Character c){ switch(c){ case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default : return 0; } } public int romanToInt(String s){ int result = 0; char[] cs = s.toCharArray(); int i = cs.length - 1; while(i>=0){ int sector = 0; char ci = cs[i--]; result+=getValue(ci); if(i<0) return result; if(ci == 'V' || ci == 'X'){// 断定I sector = judge(cs[i],'I'); } if(ci == 'L' || ci == 'C'){// 断定X sector = judge(cs[i],'X'); } if(ci == 'D' || ci == 'M'){// 断定C sector = judge(cs[i],'C'); } if(sector!=0) i--; result+=sector; } return result; } private int judge(char pre,char target){ int sector = 0; if(pre == target){ sector+=getValue(target); } return sector * -1; } public static void main(String[] args) { RomanToInteger2 rti = new RomanToInteger2(); System.out.println(rti.romanToInt("IV")); } }结果:4ms 39.9M
/** * @Author:lixici * @Date:2020/9/2 22:24 */ public class RomanToInteger3 { public int getValue(Character c){ switch(c){ case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default : return 0; } } public int romanToInt(String s) { int result = 0; int pre = getValue(s.charAt(0)); for(int i = 1;i<s.length();i++){ int after = getValue(s.charAt(i)); if(pre<after){ result-=pre; }else{ result+=pre; } // 当循环结束后,最后一个数字就在pre上,不用在里面判断到最后了把after加上 // if(i==s.length() - 1){ // result+=after; // } pre = after; } // return result; return result + pre; } public static void main(String[] args) { RomanToInteger3 rti = new RomanToInteger3(); System.out.println(rti.romanToInt("MCMXCIV")); } }不管遇到什么先按照正数加上,遇到IXC判断后面有没有出现相应的特殊字母,如果有就再减去I/X/C值的2倍。
实现略。
把IV,IX,XL,XC,CD,CM先换成其他单个字符,直接取值累加即可。
实现略。