【leetcode刷题】37.罗马数字转整数——Java版

简介: ⭐欢迎订阅《leetcode》专栏,每日一题,每天进步⭐这题懂了就非常简单。首先建立一个HashMap来映射符号和值,然后对字符串从左到右来,如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。以此类推到最左边的数,最终得到的结果即是答案——leetcode此题热评————————————————版权声明:本文为CSDN博主「一条coding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/skylibiao/article/details/119845738

前言

哈喽,大家好,我是一条。


糊涂算法,难得糊涂

Question

13. 罗马数字转整数

难度:简单


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


字符 数值

I 1

V 5

X 10

L 50

C 100

D 500

M 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

示例2:

输入: "III"
输出: 3

示例3:

输入: "IX"
输出: 9

示例4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:


1 <= s.length <= 15

s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)

题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内

题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。

IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。

关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。


Solution

注意一个点,当前值小于后一值,减掉,大于,加上。


hashmap存储映射关系

比较大小判断加减

Code

所有leetcode代码已同步至github


欢迎star

/**
 * @author yitiaoIT
 */
class Solution {
    Map<Character, Integer> symbolValues = 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 = symbolValues.get(s.charAt(i));
            if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {
                ans -= value;
            } else {
                ans += value;
            }
        }
        return ans;
    }
}

Result

复杂度分析

  • 时间复杂度:O(N)


8f8ec0e770ba94849dacb3da7223b831.png

🌈寻宝

⭐今天是坚持刷题更文的第37/100天


⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力


⭐更多算法题欢迎关注专栏《leetcode》


为了回馈各位粉丝,礼尚往来,给大家准备了一些算法教学视频和电子书


需要的小伙伴可以私信我领取,不过一定要先关注哦!不然无法发私信!


/

3340c1cc246e363c69def3b2ee72179b (1).png

相关文章
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
23 1
|
13天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
1月前
|
算法 Java
[Java·算法·中等] LeetCode15. 三数之和
[Java·算法·中等] LeetCode15. 三数之和
30 0
|
9天前
|
存储 算法
leetcode1237. 找出给定方程的正整数解
leetcode1237. 找出给定方程的正整数解
8 0
|
1月前
leetcode2376. 统计特殊整数
leetcode2376. 统计特殊整数
15 1
|
1月前
|
Serverless
leetcode2719. 统计整数数目
leetcode2719. 统计整数数目
13 0
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
21 0
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
20 0
|
27天前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
1月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记

热门文章

最新文章