13. 罗马数字转整数
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2
写做 II
,即为两个并列的 1 。12
写做 XII
,即为 X
+ II
。 27
写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在 V
(5) 和 X
(10) 的左边,来表示 4 和 9。X
可以放在 L
(50) 和 C
(100) 的左边,来表示 40 和 90。 C
可以放在 D
(500) 和 M
(1000) 的左边,来表示 400 和 900。给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = "III" 输出: 3
示例 2:
输入: s = "IV" 输出: 4
示例 3:
输入: s = "IX" 输出: 9
示例 4:
输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s
仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
s
是一个有效的罗马数字,且表示整数在范围 [1, 3999]
内相似题目
原站题解
javascript 解法, 执行用时: 120 ms, 内存消耗: 46.7 MB, 提交时间: 2023-11-17 17:46:14
/** * @param {string} s * @return {number} */ var romanToInt = function(s) { const symbolValues = new Map(); symbolValues.set('I', 1); symbolValues.set('V', 5); symbolValues.set('X', 10); symbolValues.set('L', 50); symbolValues.set('C', 100); symbolValues.set('D', 500); symbolValues.set('M', 1000); let ans = 0; const n = s.length; for (let i = 0; i < n; ++i) { const value = symbolValues.get(s[i]); if (i < n - 1 && value < symbolValues.get(s[i + 1])) { ans -= value; } else { ans += value; } } return ans; };
java 解法, 执行用时: 4 ms, 内存消耗: 42.9 MB, 提交时间: 2023-11-17 17:45:58
class Solution { Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{ put('I', 1); put('V', 5); put('X', 10); put('L', 50); put('C', 100); put('D', 500); put('M', 1000); }}; public int romanToInt(String s) { int ans = 0; int n = s.length(); for (int i = 0; i < n; ++i) { int value = symbolValues.get(s.charAt(i)); if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) { ans -= value; } else { ans += value; } } return ans; } }
golang 解法, 执行用时: 12 ms, 内存消耗: 2.6 MB, 提交时间: 2023-11-17 17:45:23
var symbolValues = map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} func romanToInt(s string) (ans int) { n := len(s) for i := range s { value := symbolValues[s[i]] if i < n-1 && value < symbolValues[s[i+1]] { ans -= value } else { ans += value } } return }
python3 解法, 执行用时: 44 ms, 内存消耗: 14.9 MB, 提交时间: 2021-05-15 16:33:25
class Solution: def romanToInt(self, s: str) -> int: ans = 0 dic_ = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} l = len(s) for i in range(0, l): v = dic_[s[i]] if i < l-1 and v < dic_[s[i+1]]: ans -= v else: ans += v return ans
cpp 解法, 执行用时: 956 ms, 内存消耗: N/A, 提交时间: 2018-08-22 17:39:18
class Solution { public: int romanToInt(string s) { int tagVal[256]; tagVal['I'] = 1; tagVal['V'] = 5; tagVal['X'] = 10; tagVal['C'] = 100; tagVal['M'] = 1000; tagVal['L'] = 50; tagVal['D'] = 500; int val = 0; for(int i = 0; i < s.length(); i++){ if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]]) val += tagVal[s[i]]; else val -= tagVal[s[i]]; } return val; } };
python3 解法, 执行用时: 152 ms, 内存消耗: N/A, 提交时间: 2018-08-22 17:37:29
class Solution: def romanToInt(self, s): """ :type s: str :rtype: int """ item = { 'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1, } t = 0 for i in range(0, len(s)-1): if item[s[i]] >= item[s[i+1]]: t += item[s[i]] else: t -= item[s[i]] t += item[s[-1]] return t