C++:
哈希表
代码思路:使用了哈希表(map)来存储罗马数字与整数的映射关系。
-
映射表: 使用 map 存储罗马数字与整数的对应关系,这里使用了 unordered_map 更合适,因为查找的时间复杂度是平均 O(1)。
-
循环迭代字符串: 从左到右遍历输入的罗马数字字符串,通过比较当前字符与下一个字符的值的大小,累加或累减相应的整数值。
向后遍历
代码思路:实现的精髓在于从右向左遍历字符串,通过比较当前字符与前一个字符的大小关系,直接进行累加或累减操作。这样的实现在时间和空间复杂度上都是相对较优的。由于使用了 unordered_map,查找整数值的操作是平均 O(1) 的时间复杂度。
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Solution {
public:
int romanToInt(string s) {
/*
// 哈希表,时间:n,空间:1
map<string, int> dict = {
{"I", 1},
{"V", 5},
{"X", 10},
{"L", 50},
{"C", 100},
{"D", 500},
{"M", 1000}
};
int res = 0;
for (int i = 0; i < s.size() - 1; i++) {
if (dict.count(s.substr(i, 1)) && dict[s.substr(i, 1)] < dict[s.substr(i + 1, 1)]) {
res -= dict[s.substr(i, 1)];
} else if (dict.count(s.substr(i, 1))) {
res += dict[s.substr(i, 1)];
} else {
return -1; // 错误代码应该是整数类型
}
}
// 处理最后一个字符
if (dict.count(s.substr(s.size() - 1, 1))) {
res += dict[s.substr(s.size() - 1, 1)];
} else {
return -1; // 错误代码应该是整数类型
}
return res;
*/
// 向后遍历,时间:n,空间:1
unordered_map<char, int> dict = {
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}
};
int res = 0, temp = 0;
for (int i = s.length()-1; i >= 0; i--)
{
int value = dict[s[i]];
value >= temp ? res += value : res -= value;
temp = value;
}
return res;
}
};
PY
class Solution:
def romanToInt(self, s):
dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
res = 0
for i in range(len(s)-1):
if s[i] in dict and dict[s[i]] < dict[s[i+1]]:
res -= dict[s[i]]
elif(s[i] in dict):
res += dict[s[i]]
else:
print("Error")
return res + dict[s[-1]]