其他人题解: 没有使用哈希表(而是使用函数返回罗马字符对应的数)
算法
(模拟) $O(n)$
使用哈希表 定义映射,将单一字母映射到数字。
从前往后扫描,如果发现 s[i+1]
的数字比 s[i]
的数字大,那么减 s[i]
,并将 i 多向后移动一位;否则加 s[i]
的值。
时间复杂度
仅遍历一次整个字符串,故时间复杂度为 $O(n)$。
空间复杂度
哈希表仅需要记录常数个数字,故空间复杂度为 $O(1)$。
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> hash;
hash['I'] = 1, hash['V'] = 5;
hash['X'] = 10, hash['L'] = 50;
hash['C'] = 100, hash['D'] = 500;
hash['M'] = 1000;
int res = 0;
for (int i = 0; i < s.size(); i ++) {
if (i + 1 < s.size() && hash[s[i]] < hash[s[i + 1]])
res -= hash[s[i]];
else res += hash[s[i]];
}
return res;
}
};
核心代码也可以这样写:
int res = 0;
for (int i = 0; i < s.size(); i ++) {
if (hash[s[i]] >= hash[s[i + 1]])
res += hash[s[i]];
else res -= hash[s[i]];
}