Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
按找下面的对应关系,将罗马字符转换成数字。
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
我的思路:
根据官方给出的例子,将罗马符号进行分词(如下面例子),但是在写分词方法的时候发现,只要是按大小顺序,则数据是相加,反之则相减,比如 I 小于 V ,则 IV = 5-1, III 则为 1+1+1
MCMXCIV 分为 M = 1000, CM = 900, XC = 90 and IV = 4.
我的代码:
public static int romanToInt(String s) { char[] arr= s.toCharArray(); //组装数据 int[] num={1,5,10,50,100,500,1000}; char[] roms={'I','V','X','L','C','D','M'}; Map<String,Integer> map= new HashMap<String,Integer>(); for (int i = 0; i < roms.length; i++) { map.put(String.valueOf(roms[i]),num[i]); } int count=map.get(String.valueOf(arr[arr.length-1])); // 分词 for (int i = arr.length-1; i>0 ; i--) { if(map.get(String.valueOf(arr[i-1]))>=map.get(String.valueOf(arr[i]))){ count+=map.get(String.valueOf(arr[i-1])); }else{ count-=map.get(String.valueOf(arr[i-1])); } } return count; }
结果 :Runtime: 8 ms, faster than 80.03% of Java online submissions for Roman to Integer. 居然超过了80.03% 的用户,比上一题的7% 提升了很多,现在去看看别人的解题思路。
在网上看其他人的思路,和我的大概一致,但是在 实现上可以通过 switch 来 构造 map 的功能,这样能减少String 和 char 之间的转换。
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;
}