leetcode-13. Roman to Integer
思路:首先是本弱鸡的弱鸡思路
1、将所有的组合放入Map中,key值代表罗马数字,value代表罗马数字对应的整数值
2、每次取两个值进行判断,如果匹配直接跳两个继续匹配,否则取一个进行匹配
ps:这样做的缺点就是,无法判断输入的数字是否是罗马数字,而且判断比较繁琐,
对于此题,题目中未让判断输入是否是罗马数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | class Solution { public int romanToInt(String s) { Map<String,Integer> resultMap = new HashMap<String, Integer>(); resultMap.put( "I" , 1 ); resultMap.put( "V" , 5 ); resultMap.put( "X" , 10 ); resultMap.put( "L" , 50 ); resultMap.put( "C" , 100 ); resultMap.put( "D" , 500 ); resultMap.put( "M" , 1000 ); resultMap.put( "IV" , 4 ); resultMap.put( "IX" , 9 ); resultMap.put( "XL" , 40 ); resultMap.put( "XC" , 90 ); resultMap.put( "CD" , 400 ); resultMap.put( "CM" , 900 ); int len = s.length(); int result = 0 ; //长度为1直接匹配 if (len== 1 ){ result += resultMap.get(s); // System.out.println(result); return result; } if (len== 2 ){ //长度为2直接匹配 if (resultMap.containsKey(s)){ result += resultMap.get(s); // System.out.println(result); return result; } else { //两个分别匹配 result += resultMap.get(s.substring( 0 , 1 )); result += resultMap.get(s.substring( 1 , 2 )); // System.out.println(result); return result; } } String flag = "" ; int strstart = 0 ; //用来判断最后单独判断的值的开始位置,(当倒数第二三个两个可以匹配时,最后剩下一个数需要判断,否则两个) //到这里的都是长度>=3的,然后我们循环0 --- len-2 的值(因为下边的判断有i+2,可能会造成数组越界) for ( int i= 0 ;i<len- 2 ;i++){ flag = s.substring(i,i+ 2 ); //先判断两个的组合看是否匹配,不匹配则再尝试一个的 if (resultMap.containsKey(flag)){ result += resultMap.get(flag); i=i+ 1 ; //如果两个的匹配了,i需要+1 strstart = i+ 1 ; } else { flag = s.substring(i,i+ 1 ); result += resultMap.get(flag); strstart = i+ 1 ; } } //取最后剩下的值进行判断 String str2end = s.substring(strstart,len); if (resultMap.containsKey(str2end)){ result += resultMap.get(str2end); // System.out.println(result); return result; } else { result += resultMap.get(str2end.substring( 0 , 1 )); result += resultMap.get(str2end.substring( 1 , 2 )); // System.out.println(result); return result; } } } |
大神思路:
参考:https://www.cnblogs.com/grandyang/p/4120857.html
首先是罗马数字的规则
1、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
2、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
3、V 和X 左边的小数字只能用Ⅰ。
4、L 和C 左边的小数字只能用X。
5、D 和M 左边的小数字只能用C。
然后是解法:
根据规则可以分析到
1、两个数的组合AB,要加上B减去A。单个数字直接加上就可以
2、如果是两个数字的组合,则当前数字的后一个数字一定是大于当前数字的,所以当当前数字的后一个数字小于当前数字时
加上当前数字即可
3、最后一个数字因为没有后一位数字,所以单独判断。最后一位数字直接加上即可。
总结:
1、如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字
2、其他情况则减去这个数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Solution{ public int romanToInt(String s) { int result = 0 ; char [] ch = s.toCharArray(); Map<String,Integer> resultMap = new HashMap<String, Integer>(); resultMap.put( "I" , 1 ); resultMap.put( "V" , 5 ); resultMap.put( "X" , 10 ); resultMap.put( "L" , 50 ); resultMap.put( "C" , 100 ); resultMap.put( "D" , 500 ); resultMap.put( "M" , 1000 ); for ( int i= 0 ;i<ch.length- 1 ;i++){ int ans1 = resultMap.get(ch[i]+ "" ); int ans2 = resultMap.get(ch[i+ 1 ]+ "" ); if (ans1>=ans2){ result += ans1; } else { result -= ans1; } } result += resultMap.get(ch[ch.length- 1 ]+ "" ); System.out.println(result); return result; } } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步