罗马数字转整数:相邻字符决定加减
335 字
2 分钟
罗马数字转整数:相邻字符决定加减
核心结论
有效罗马数字通常从大到小排列;当较小字符出现在较大字符左侧时,这一位需要做减法。扫描字符串时比较当前值和下一位即可,无须单独枚举 IV、IX 等组合。
字符映射
| 字符 | I | V | X | L | C | D | M |
|---|---|---|---|---|---|---|---|
| 数值 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
例如 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/相关文章智能推荐
1
字母异位词分组:排序键与哈希表
algorithms将每个单词排序后的结果作为哈希键,归并由相同字符组成的字符串,并分析正确性与复杂度。
2
缺失数字:标记数组解法
algorithms使用长度为 n+1 的标记数组记录出现过的数字,并讨论异或与数学求和等低空间替代方案。
3
最大正方形:用相邻状态确定边长
algorithms定义以当前单元格为右下角的最大正方形边长,推导三邻居状态转移,并给出 Java 动态规划实现。
4
最小路径和:压缩二维动态规划
algorithms从只能向右或向下移动的约束推导最小路径和状态转移,并将二维状态表压缩为一维数组。
5
太平洋大西洋水流:从海岸反向搜索
algorithms从两片海洋的边界逆着水流方向搜索,求两个可达集合的交集,避免从每个陆地单元重复遍历。
随机文章随机推荐


