Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
1刷
题解:
"IV"代表4, "VI"代表6,那么就是说,较小的数字出现在较大的数字左边时,这里代表两者作差,即 较大数字 - 较小数字,否则代表两者的和。 这样我们就可以从左向右遍历字符串,先设定result = map.get(s.charAt(0)),然后从第一个位置开始遍历, 比较当前字符代表的数字和上一个字符代表的数字,根据我们上面得出的结论来计算。lastNum >= curNum时,我们直接加curNum, 当lastNum < curNum时,我们之前已经加过一次lastNum,所以这时候要加curNum并且减掉两个lastNum。最后返回结果。
如果用array替代map会更快
public class Solution {
public int romanToInt(String s) {
if(s == null || s.length() == 0) return 0;
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int res = map.get(s.charAt(0));
int lastNum = res;
for(int i=1; i<s.length(); i++){
int curNum = map.get(s.charAt(i));
if(lastNum < curNum) res -= 2*lastNum;
res += curNum;
lastNum = curNum;
}
return res;
}
}