写点什么

【LeetCode】罗马数字转整数 Java 题解

用户头像
HQ数字卡
关注
发布于: 2021 年 05 月 15 日

题目描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。


字符          数值I             1V             5X             10L             50C             100D             500M             1000
复制代码


例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。


通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:


I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
复制代码


示例 1:


输入: "III"输出: 3
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/roman-to-integer著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 这个题目整数转罗马数字是相关联题目,通过这两个题目可以更好的理解罗马数字的简单编码规则。

  • 当罗马数字中小的数字在大的数字的右边时,累加即可。反之,则需要取反,相减。

AC 代码

class Solution {    Map<Character, Integer> map = new HashMap<Character, Integer>(){{        put('I', 1);        put('V', 5);        put('X', 10);        put('L', 50);        put('C', 100);        put('D', 500);        put('M', 1000);    }};
public int romanToInt(String s) { int ans = 0; int n = s.length(); for (int i = 0; i < n; i++) { int value = map.get(s.charAt(i)); if (i < n - 1 && value < map.get(s.charAt(i + 1))) { ans -= value; } else { ans += value; } }
return ans; }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n), 空间复杂度是 O(1)

  • 坚持每日一题,加油!

发布于: 2021 年 05 月 15 日阅读数: 13
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】罗马数字转整数Java题解