该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:
遍历时是从后往前遍历的:
1> 刚开始时,temp = 0; 遍历当前遍历到第一个X,则temp == 0 < 10 == X ,则res = 10;temp = 10;
2> 继续向前遍历,又遇到X,此时temp == 10 = 10 == X,则 res = res + 10;即res = 20; temp = 10;
3> 继续向前遍历,遇到I,此时temp == 10 > 1 == I; 则 res = res - 1; 即res = 19; temp = 1;
循环终止;
1 public class Solution {
2 // 基本思想是根据罗马数字的特征,即左加右减的规律, 比如IX = 9, XI =11
3 public int romanToInt(String s) {
4 if(s == null || s.length() < 1)
5 return -1;
6 char[] ch = s.toCharArray();
7 HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
8 hm.put('I', 1);
9 hm.put('V', 5);
10 hm.put('X', 10);
11 hm.put('L', 50);
12 hm.put('C', 100);
13 hm.put('D', 500);
14 hm.put('M', 1000);
15 int res = 0;
16 int temp = 0; // 临时变量,保存的是当前遍历的上一个数值的值
17 int value = 0; // 当前罗马值的大小
18 for(int i = ch.length - 1; i >= 0; i--)
19 {
20 value = hm.get(ch[i]);
21 if(temp <= value) // 左加
22 {
23 res += value;
24 temp = value;
25 }
26 else // 右减
27 {
28 res -= value;
29 temp = value;
30 }
31 }
32 return res;
33 }
34 }
35