[LeetCode] Roman to Integer 羅馬數字轉化成整數

鏈接https://leetcode.com/problems/roman-to-integer/#/description
難度:Easy
題目:13. Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
翻譯:將給定的羅馬數字轉化為整數,輸入保證在1~3999之間
概念:什么是羅馬數字?

羅馬數字共有7個,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、?(50)、?(100)、?(500)和?(1000)。按照下述的規則可以表示任意正整數。需要注意的是羅馬數字中沒有“0”,與進位制無關。一般認為羅馬數字只用來記數,而不作演算。
重復數次:一個羅馬數字重復幾次,就表示這個數的幾倍。
右加左減:在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。
左減的數字有限制,僅限于I、X、C。比如45不可以寫成VL,只能是XLV。但是,左減時不可跨越一個位值。
左減數字必須為一位,比如8寫成VIII,而非IIX。
右加數字不可連續超過三位,比如14寫成XIV,而非XIIII。
數碼限制:同一數碼最多只能連續出現三次,如40不可表示為XXXX,而要表示為XL。等
——維基百科

tips: 3999范圍內的羅馬數字不會用到加上劃線的字母
思路:從最后一個字符開始,如果當前字符對應的數字比上一個數字小,那么就把結果減去當前字符對應的數字,否則加上當前字符對應數字。為了處理邊界情況,在原字符串最后添加一個字符,該字符是原來的尾字符。
參考代碼
Java

public class Solution {
    public int romanToInt(String s) {
        if(s==null || s.length()==0)
            return 0;
        Map<Character, Integer> m = new HashMap<Character, Integer>();
        m.put('I',1);
        m.put('V',5);
        m.put('X',10);
        m.put('L',50);
        m.put('C', 100);
        m.put('D', 500);
        m.put('M', 1000);
        
        int length = s.length();
        int result = m.get(s.charAt(length-1));
        for (int i=length-2; i>=0; i--){
            if(m.get(s.charAt(i))<m.get(s.charAt(i+1)))
                result -= m.get(s.charAt(i));
            else
                result += m.get(s.charAt(i));
        }
        return result;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容