题目要求
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 | 数值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
- 示例 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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
除了特殊情况以外(4,9,40,90等),这里的核心其实就是累加,如VII,就是5+1+1 = 7,即可以通过遍历字符串来将每个字符对应的值找到并累加。其实可以将特殊情况也用这样的方法的看,比如IV,就是在找到字符对应的值的时候,与后一位(如果存在的话)的对应的值进行比较,如果小于的话,那么就可以将该位上的值取反,即-1 + 5 = 4。
class Solution {
public:
int romanToInt(string s) {
int len = s.size();
if (len == 0)
return 0;
int res = 0;
for (int i = 0; i < len; i++)
{
int temp = getSingleInt(s[i]);
if (i+1 < len && temp < getSingleInt(s[i+1]))
{
temp = 0 - temp;
}
res += temp;
}
return res;
}
int getSingleInt(char c)
{
switch (c)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return 0;
}
};
复杂度分析
时间复杂度:遍历字符串
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)