模拟
题目已经把罗马数字的规则给得很清楚了,普通情况就是把每个字符对应的数值累加,特殊情况则是六种固定的双字符组合,因此可以直接按照题意模拟转换过程。
遍历字符串时,优先判断当前位置和下一位置能否组成特殊组合,如果可以就加上对应数值并跳过下一位,否则按单个字符进行转换即可。
时间复杂度 $O(n)$
空间复杂度 $O(1)$
1 | class Solution { |
也可以不专门判断六种特殊组合,而是从规则本身出发。
如果当前字符对应的数值小于右边字符,那么它在答案中应当被减去,例如 $IV$ 中的 $I$,$IX$ 中的 $I$,$CM$ 中的 $C$。反之,如果当前字符大于等于右边字符,那么它就正常加到答案中。
这样只需要一次遍历,就能把普通情况和特殊情况统一处理掉。
时间复杂度 $O(n)$
空间复杂度 $O(1)$
1 | class Solution { |