罗马数字转整数:HashMap+反向循环为何优于算术解法?
罗马数字转整数:HashMap+反向循环方案更优的原因?
我在LeetCode上遇到一道罗马数字转整数的问题,通过简单算术运算完成了解题,但朋友告诉我在此类场景下使用HashMap和反向循环的方案更优。请问该方案在该场景下更出色的原因是什么?
我的解法代码:
class Solution: def romanToInt(self, s: str) -> int: answer = 0 answer = (s.count('M') * 1000) + (s.count('C') * 100) + (s.count('X') * 10) + (s.count('I') * 1) answer += (s.count('D') * 500) + (s.count('L') * 50) + (s.count('V') * 5) answer -= (s.count('CM') * 200) + (s.count('XC') * 20) + (s.count('IX') * 2) answer -= (s.count('CD') * 200) + (s.count('XL') * 20) + (s.count('IV') * 2) return answer
为什么HashMap+反向循环方案更优?
- 时间效率更高:你的解法多次调用
str.count(),每次count都会完整遍历字符串一次,总共要扫12遍字符串,时间复杂度为O(n*k)(n是字符串长度,k是count调用次数)。而HashMap+反向循环只需要遍历字符串一次,时间复杂度是O(n),字符串越长,效率差距越明显。 - 逻辑更通用、易扩展:罗马数字核心规则是"大数在前加,小数在前减",HashMap方案完全贴合这个规则,只需要维护一个字符到数值的映射表即可。你的解法则需要单独枚举所有特殊组合并调整数值,若规则有变动(比如新增特殊组合),修改成本更高,还容易遗漏。
- 逻辑更直观,可读性更强:反向循环的思路是从右往左遍历,拿当前字符对应的数值和前一个数值比较,小就减、大就加,完全符合罗马数字的读写逻辑。而你的解法需要记住每个特殊组合要减去多少倍的基础值,读代码的人需要花时间理清这些加减逻辑的由来。
- 避免子串匹配的额外开销:你用
count('CM')这类操作时,底层会做子串匹配的遍历,这是额外的性能消耗。而反向循环只需要逐个取字符比较,没有子串匹配的开销。
内容的提问来源于stack exchange,提问作者Eric Idogun
相关产品推荐
相关产品推荐

