[LeetCode]13. 罗马数字转整数(Roman numeral to integer) Java

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40914991/article/details/82055437

一、题目:

LeetCode地址

罗马数字包含以下七种字符:I, V, X, LCD 和 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 的范围内。

二、分析:

该题我尝试了两种方法,第一种较为简单,将罗马数字放在map集合中,如果小的数字在大的数字右边,则加,否则减;第二种稍微麻烦一点,如果小的数字在大的数字左边,则对应情况将两个数字都加起来。

三、Java代码:

第一种:

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

第二种:

public static int romanToInt(String s) {
  String[] strings = s.split("");
        for (int i = 0; i < strings.length; i++) {
            switch (strings[i]) {
                case "I": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("V")) a += 4;
                    if (i!=strings.length-1 && strings[i + 1].equals("X")) a += 9;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                case "X": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("L")) a += 40;
                    if (i!=strings.length-1 && strings[i + 1].equals("C")) a += 90;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                case "C": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("D")) a += 400;
                    if (i!=strings.length-1 && strings[i + 1].equals("M")) a += 900;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                default:
                    a += count(strings[i]);
                    break;
            }
        }
    }
private static int count(String s) {
        if(s.equals("I")) return 1;
        if(s.equals("V")) return 5;
        if(s.equals("X")) return 10;
        if(s.equals("L")) return 50;
        if(s.equals("C")) return 100;
        if(s.equals("D")) return 500;
        return 1000;
}

四、提交结果:

猜你喜欢

转载自blog.csdn.net/qq_40914991/article/details/82055437