天天看點

LeetCode: 13. 羅馬數字轉整數

題目

給定一個羅馬數字,将其轉換成整數。

傳回的結果要求在 1 到 3999 的範圍内。

羅馬數字

羅馬數字字母

羅馬數字隻有7個字母組成,每個字母代碼的字如下

字母 數字
M 1000
D 500
C 100
L 50
X 10
V 5
I 1

四個規則

  1. 相同的數字連寫, 所表示的數等于這些數字相加得到的數。如 XXX表示 30
  2. 小的數字在大的數字的右邊, 所表示的數等于這些數字相加得到的數 如VIII 表示8
  3. 小的數字(限于I, X, C)在大的數字的左邊, 所表示的數等于大數減去小的數: 如IV 表示4
  4. 在一個數的上面畫一條橫線, 表示這個數增值1000倍(由于題目隻考慮4000以内的數,是以這條規則不用考慮)。

五個組數規則

  1. I, X, C: 最多隻能連用3個, 如果放在大數的左邊,隻能用1個。
  2. V, L, D: 不能放在大數的左邊,隻能使用一個。
  3. I 隻能用在V和X的左邊。 IV表示4, IX表示9
  4. X隻能放在L,C左邊。 XL 表示40, XC表示90
  5. C隻能用在D, M左邊。 CD 表示400, CM表示900

分析

  • 從13個羅馬數字的從大到小依次判斷
  • 判斷字元串是否以該羅馬數字開頭
  • 取剩餘子串繼續循環

解題

class Solution {
    public int romanToInt(String s) {
        if(s.length() == ) return ;
        int ret = ;
        int[] number = {, , , , ,, , , , , , , };  
        String[] roms = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        for(int i = ; i <  && s.length() > ; i++){   
            while(s.startsWith(roms[i])) {
                ret += number[i];
                s = s.substring(roms[i].length());
            } 
        }  
        return ret;
    }
}
           

啟示

  • 主要是規則,可以記住羅馬數字規則
  • 注意邊界值的判斷,如複雜邊界值,可以舉例試驗