罗马数字转整数:相邻字符决定加减

335 字
2 分钟
罗马数字转整数:相邻字符决定加减

核心结论#

有效罗马数字通常从大到小排列;当较小字符出现在较大字符左侧时,这一位需要做减法。扫描字符串时比较当前值和下一位即可,无须单独枚举 IV、IX 等组合。

字符映射#

字符IVXLCDM
数值1510501005001000

例如 MCMXCIV 的计算过程是 1000 - 100 + 1000 - 10 + 100 - 1 + 5 = 1994。

Java 实现#

class Solution {
    private static final Map<Character, Integer> VALUES = Map.of(
        'I', 1,
        'V', 5,
        'X', 10,
        'L', 50,
        'C', 100,
        'D', 500,
        'M', 1000
    );

    public int romanToInt(String value) {
        int result = 0;
        for (int index = 0; index < value.length(); index++) {
            int current = VALUES.get(value.charAt(index));
            if (
                index + 1 < value.length() &&
                current < VALUES.get(value.charAt(index + 1))
            ) {
                result -= current;
            } else {
                result += current;
            }
        }
        return result;
    }
}

正确性与复杂度#

对于题目保证有效的输入,较小值位于较大值左侧时恰好表示减法,其余位置表示加法。每个字符处理一次,时间复杂度为 O(n);映射表大小固定,额外空间为 O(1)。

边界#

该实现依赖“输入是有效罗马数字”的题目约束。若用于真实输入,需要另外验证非法字符、错误重复和不允许的减法组合。

验证#

至少测试 III -> 3、IV -> 4、LVIII -> 58 和 MCMXCIV -> 1994。

参考#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

罗马数字转整数:相邻字符决定加减
https://blog.mintalix.com/posts/study-romantoint/
作者
Mint
发布于
2021-09-15
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Mint
软件开发、工程实践与技术思考。
分类
标签