13. Roman to Integer [easy] (java)

本贴最后更新于 2451 天前,其中的信息可能已经水流花落

题目链接

题目原文

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

题目翻译

给定一个罗马数字,将其转成整数。输入限制在 1 到 3999 之间。

思路方法

做题的第一步要理解题。说实话,我是不清楚罗马数字的记法的,所以查了一下资料,这里也简单介绍一下吧。

罗马数字采用七个罗马字母作数字:
I(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。

记数的方法:
1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如 III=3;
2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 VIII=8、XIII=12;
3. 小的数字(限于 I、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 IV=4、IX=9;
4. 在一个数的上面画一条横线,表示这个数增值 1,000 倍。

常用数字记法举例:

Roman Integer Roman Integer
I 1 XXIX 29
II 2 XXX 30
III 3 XL 40
IV 4 L 50
V 5 LX 60
VI 6 LXX 70
VII 7 LXXX 80
VIII 8 XC 90
IX 9 XCIX 99
X 10 C 100
XI 11 CI 101
XII 12 CXCIX 199
XIII 13 CC 200
XIV 14 CCC 300
XV 15 CD 400
XVI 16 D 500
XVII 17 DCLXVI 666
XVIII 18 M 1,000
XIX 19 MCMXCIX 1,999
XX 20 MM 2,000
XXI 21 MMM 3,000
XXII 22 MMMM 4,000
XXVIII 28 MMMMCMXCIX 4,999

思路一

根据上面说的计数方法的前三条。对于输入的罗马数字字符串,从后向前扫描,遇到前面数大于等于后面的最大数的时候,相加;遇到前面数小于后面的最大数的时候,相减。

代码

class Solution {
    public int romanToInt(String s) {
       Map<Character,Integer> map = new HashMap<>();
        map.put('I',1);
        map.put('X',10);
        map.put('C',100);
        map.put('M',1000);
        map.put('V',5);
        map.put('L',50);
        map.put('D',500);
        int sum = 0;
        int max = 1;
        for (int i = s.toCharArray().length - 1; i >= 0 ; i--) {
            char c = s.toCharArray()[i];
            if (map.get(c) >= max){
                max = map.get(c);
                sum += map.get(c);
            }
            else{
                sum -= map.get(c);
            }
        }
        return sum;
    }
}
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...