题目描述
罗马数字包含以下七种字符: I, V, X, L, C, D 和 M。字符相同的数字表示相加的数,较小的数字在较大的数字前面表示相减的数。给定一个罗马数字,将其转换为整数。
示例:
输入: “III”
输出: 3
输入: “IV”
输出: 4
输入: “IX”
输出: 9
输入: “LVIII”
输出: 58
输入: “MCMXCIV”
输出: 1994
实现思路
遍历字符串,比较相邻两个字符的值,如果前一个字符代表的数值小于等于后一个字符代表的数值,则将前一个字符对应的值累加到结果中;否则从结果中减去前一个字符对应的值。
算法实现
C
#include <string.h>
int romanToInt(char *s) {
int len = strlen(s);
int result = 0;
int prevValue = 0;
for (int i = len - 1; i >= 0; i--) {
switch (s[i]) {
case 'I': int value = 1; break;
case 'V': value = 5; break;
case 'X': value = 10; break;
case 'L': value = 50; break;
case 'C': value = 100; break;
case 'D': value = 500; break;
case 'M': value = 1000; break;
}
if (value < prevValue) result -= value;
else { result += value; prevValue = value; }
}
return result;
}
Python
def roman_to_int(s: str) -> int:
mapping = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
prev_value = 0
for char in reversed(s):
value = mapping[char]
if value < prev_value:
result -= value
else:
result += value
prev_value = value
return result
Java
public int romanToInt(String s) {
Map<Character, Integer> mapping = new HashMap<>();
mapping.put('I', 1);
mapping.put('V', 5);
mapping.put('X', 10);
mapping.put('L', 50);
mapping.put('C', 100);
mapping.put('D', 500);
mapping.put('M', 1000);
int result = 0;
int prevValue = 0;
for (int i = s.length() - 1; i >= 0; i--) {
int value = mapping.get(s.charAt(i));
if (value < prevValue) result -= value;
else {
result += value;
prevValue = value;
}
}
return result;
}
时间复杂度
O(n),其中n是罗马数字字符串的长度。因为只需要遍历一次字符串即可得到结果。