#13 罗马数字转整数
(题目好长...)
罗马数字包含以下七种字符: I,V,X,L,C,D和M。
字符 数值I 1V 5X 10L 50C 100D 500M 1000
例如,罗马数字2写做 II,即为两个并列的1。
12写做XII,即为X+ II。27写做XVII,即为XX+V+II。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。
这个特殊的规则只适用于以下六种情况:
① I可以放在V (5)和X (10)的左边,来表示4和9。
②X可以放在L(50)和C(100)的左边,来表示40和90。
③C可以放在D (500)和M (1000) 的左边,来表示400和900。
给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。
1)哈希表
将所有可能的组合写入哈希表中。
先两位两位进行判断是否是特殊组合中的一种,若不满足则按照单个字符进行处理。
class Solution { public int romanToInt(String s) { Map map = new HashMap<>(); map.put("I", 1); map.put("IV", 4); map.put("V", 5); map.put("IX", 9); map.put("X", 10); map.put("XL", 40); map.put("L", 50); map.put("XC", 90); map.put("C", 100); map.put("CD", 400); map.put("D", 500); map.put("CM", 900); map.put("M", 1000); int num = 0; for(int i = 0; i //先两位两位判断 if(i+1map.containsKey(s.substring(i, i+ num +=map.get(s.substring(i, i+2)); i+=2; } //再一位一位判断 else{ num += map.get(s.substring(i, i+1)); i++; } } return num; }}
2)switch case
思路和上一种方法类似,只考虑了题目中所说的6种特殊情况,用了switch case方法,效率比哈希表高一些。
可以自己想想为什么是num+3、num+5、num+8、num+10 ......
class Solution {public int romanToInt(String s) { int num=0; for(int i=0;i switch(s.charAt(i)){ case 'I': num+=1;break; case 'V': num=(i-1>=0 && s.charAt(i-1) == 'I')?num+3:num+5; break; case 'X': num=(i-1>=0 && s.charAt(i-1) == 'I') ? num+8 : num+10; break; case 'L': num=(i-1>=0 && s.charAt(i-1) == 'X') ? num+30 : num+50; break; case 'C': num=(i-1>=0 && s.charAt(i-1) == 'X') ? num+80 : num+100; break; case 'D': num=(i-1>=0 && s.charAt(i-1) == 'C') ? num+300 : num+500; break; case 'M': num=(i-1>=0 && s.charAt(i-1) == 'C') ? num+800 : num+1000; break; default: break; } } if(num >3999) return 0; return num; }}
3)大佬写的...
思路是:如果小数在大数的左边就减,小数在大数右边就加。也是用了switch case.
妙啊~
import java.util.*;class Solution { public int romanToInt(String s) { int sum = 0; int preNum = getValue(s.charAt(0)); for(int i = 1;i < s.length(); i ++) { int num = getValue(s.charAt(i)); if(preNum < num) { sum -= preNum; } else { sum += preNum; } preNum = num; } sum += preNum; return sum; } private int getValue(char ch) { switch(ch) { 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; } }}
假期想一起学Java的小伙伴可以加qq群:563347237,相互监督,共同进步。
【阅读全文】进入练习