13. Roman to Integer
- 罗马数字规则
题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
思路
- 罗马数字规则
- 基本表达:I = 1; V = 5; X = 10; L = 50; C = 100; D = 500; M = 1000;
- 相同数字相连或者小数在大数后面,则表示这些数字相加所得的数,如III=3,CII=102;
- 小数(限于I, X, C)在大数前面,则表示大数减小数所得的数,如IV=4;
- 复杂性分析:
- 时间复杂度:O(n).
- 空间复杂度:O(1).
题解
class Solution {
public:
int romanToInt(string s) {
int ans = 0;
string baseRoman = "MDCLXVI";
int numValue[] = {1000,500, 100, 50, 10, 5, 1};
int preIndex, postIndex;
for (int i = 0; i < s.size(); i++) {
for (int j = 0; j < baseRoman.size(); j++) {
if (baseRoman[j] == s[i]) {
preIndex = j;
break;
}
}
if (s[i+1] != '\0') {
for (int j = 0; j < baseRoman.size(); j++) {
if (baseRoman[j] == s[i+1]) {
postIndex = j;
break;
}
}
if (preIndex <= postIndex) {
ans += numValue[preIndex];
} else {
ans = ans + numValue[postIndex] - numValue[preIndex];
i += 1;
}
} else {
ans += numValue[preIndex];
}
}
return ans;
}
};