罗马数字转换为整数,题目如下:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the r50,ange from 1 to 3999.
首先我们要知道罗马数字的规则:
1、罗马数字共有七个基本符号,I,V,X,L,C,D,M;分别代表1,5,10,50,100,500,1000;
2、相同的数字连写,表示这些数字相加,如 II 表示 2;
3、小数在大数右边,表示大数加上小数,如 VII 表示 5 + 2 = 7;
4、小的数字在大的数字左边,表示大数减去小数,如 IV 表示 5 - 1 = 4;
5、一般连写的数字不超过三次。
知道了基本规则之后,可以编写代码如下:
class Solution {
public:
int romanToInt(string s) {
s += 'x';
int result = 0;
for (int i = 0; s[i] != 'x'; i++) {
switch (s[i]) {
case 'I':
if (s[i+1] == 'V' || s[i+1] == 'X') {
result -= 1;
}
else result += 1;
break;
case 'V':
result += 5;
break;
case 'X':
if (s[i+1] == 'L' || s[i+1] == 'C') {
result -= 10;
}
else result += 10;
break;
case 'L':
result += 50;
break;
case 'C':
if (s[i+1] == 'D' || s[i+1] == 'M') {
result -= 100;
}
else result += 100;
break;
case 'D':
result += 500;
break;
case 'M':
result += 1000;
}
}
return result;
}
};
分析:因为只用了一个循环,所以算法的时间复杂度为 O(n),空间复杂度为 O(1)。