Day9 Roman to Integer(2)

tech2022-08-18  140

看了精选题解

把static map换成switch并没有快,还多占用了0.3M内存(可能和用例有关吧)【6ms 40.3M】发现自己中途过度理解题意(出现在前面的负数位,最多只出现一次)其实无所谓是谁出现在谁前面是负数,只要是小的在大的前面,小的就算是负数。发现了彩蛋实现

Code

a. 去掉了多余的循环判断,保留switch

修改了对比前后数字的方法,没必要把数组传过去,按题意也不会出现多次,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")); } }

b. 前数比后数小,则前数记负值

结果: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")); } }

c. 从前往后读

不管遇到什么先按照正数加上,遇到IXC判断后面有没有出现相应的特殊字母,如果有就再减去I/X/C值的2倍。

实现略。

d.彩蛋

把IV,IX,XL,XC,CD,CM先换成其他单个字符,直接取值累加即可。

实现略。

最新回复(0)