Roman to Integer
Solution 1
上一个题的反过来,本身没什么难度,也是一个最长贪心匹配。由于没有边界特殊情况,因此本题所需要的边界条件特别少。
- 时间复杂度: O ( 1 ) O(1) O(1),由于数字的表示范围有限,因此计算空间也是固定有限的
- 空间复杂度: O ( 1 ) O(1) O(1),因为只需要保存26个内容,13个字符串和13个对应的数字,然后处理这个数字就可以了,状态量为常数个
class Solution {
public:
int romanToInt(string s) {
map<string, int> r2i = {
{"I", 1},
{"IV", 4},
{"V", 5},
{"IX", 9},
{"X", 10},
{"XL", 40},
{"L", 50},
{"XC", 90},
{"C", 100},
{"CD", 400},
{"D", 500},
{"CM", 900},
{"M", 1000},
};
int ans = 0;
int pos = 0, length = s.size();
while(pos < length) {
if ((pos < length - 1 && s.at(pos) == 'I' && (s.at(pos + 1) == 'V' || s.at(pos + 1) == 'X'))
|| (pos < length - 1 && s.at(pos) == 'X' && (s.at(pos + 1) == 'L' || s.at(pos + 1) == 'C'))
|| (pos < length - 1 && s.at(pos) == 'C' && (s.at(pos + 1) == 'D' || s.at(pos + 1) == 'M'))
) {
string roman = s.substr(pos, 2);
ans += r2i[roman];
pos += 2;
}
else {
string roman = s.substr(pos, 1);
ans += r2i[roman];
pos ++;
}
}
return ans;
}
};
Solution 2
Python实现。
class Solution:
def romanToInt(self, s: str) -> int:
r2i = {
"I": 1,
"IV": 4,
"V": 5,
"IX": 9,
"X": 10,
"XL": 40,
"L": 50,
"XC": 90,
"C":100,
"CD": 400,
"D": 500,
"CM": 900,
"M": 1000,
}
double_check = ["IV", "IX", "XL", "XC", "CD", "CM"]
pos = 0
ans = 0
while pos < len(s):
if pos < len(s) - 1 and s[pos: pos + 2] in double_check:
ans += r2i[s[pos: pos + 2]]
pos += 2
else:
ans += r2i[s[pos]]
pos += 1
return ans