描述
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 1000For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV.
Because the one is before the five we subtract it making four. The same
principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
Ican be placed beforeV(5) andX(10) to make 4 and 9.Xcan be placed beforeL(50) andC(100) to make 40 and 90.Ccan be placed beforeD(500) andM(1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III"
Output: 3
Example 2:
Input: "IV"
Output: 4
Example 3:
Input: "IX"
Output: 9
Example 4:
Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.思路
这道题是LeetCode第12题的逆向应用,不过是更简单的版本,因为不涉及给出的情况之外的罗马字符,即使用题目中给出的字符,加上判断字符代表的大小位置关系(左大右小时将左边的数字加到sum上;左小右大时用右边的数据减去左边的数据,再将结果加到sum上)。
class Solution {
public int romanToInt(String s) {
int sum = 0;
//使用map保存对应的字母和数字,省去遍历的操作
Map<Character, Integer> map = new HashMap<Character, Integer>();
map.put('M', 1000);
map.put('D', 500);
map.put('C', 100);
map.put('L', 50);
map.put('X', 10);
map.put('V', 5);
map.put('I', 1);
//新增两个变量,一个代表当前的字符,另一个提前读取下一个字符
int curr = 0, next = 0;
for(int i = 0; i<s.length(); i++){
//当前字符为最后一个字符时
if(i == s.length() - 1){
curr = map.get(s.charAt(i));
sum = sum + curr;
}else{
curr = map.get(s.charAt(i));
next = map.get(s.charAt(i+1));
//当前字符是给出的字符集中的(左大右小)
if(curr >= next){
sum = sum + curr;
}else{
//左小右大
sum = sum - curr + next;
i++;
}
}
}
return sum;
}
}只需要遍历字符串一次,效率比较高。