1. 程式人生 > >[LeetCode]13. 羅馬數字轉整數(Roman numeral to integer) Java

[LeetCode]13. 羅馬數字轉整數(Roman numeral to integer) Java

一、題目:

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;
}

四、提交結果: