1. 程式人生 > >[LeetCode]13. Roman to Integer羅馬數字轉整數

[LeetCode]13. Roman to Integer羅馬數字轉整數

instead placed man for sym () 兩種 字符 together

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II in Roman numeral, just two one‘s added together. Twelve is written as, XII

, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX

. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9.
  • X can be placed before L (50) and C (100) to make 40 and 90.
  • C can be placed before D (500) and M (1000) to make 400 and 900.

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

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 5:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

跟上一題相反,要把羅馬數字轉成阿拉伯數字,觀察之後我們發現,可以從左到右遍歷羅馬數字的字符串,無非兩種可能
1.當前字符是最後一位或者表示數字不小於後面一位字符表示數字,類似VII,就是往上加,先是5,然後是5+1,最後6+1
2.當前字符表示數字比後一位字符小,類似IV,就需要減去當前位的數字
class Solution {
    public int romanToInt(String s) {
        if (s == null || s.length() == 0)    return -1;
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        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);
        int res = 0;
        for(int i=0;i<s.length();i++){
            int val=map.get(s.charAt(i));
            if(i==s.length()-1 || map.get(s.charAt(i+1))<=map.get(s.charAt(i))){
                res=res+val;
            }else{
                res=res-val;
            }
        }
        return res;

    }
}

[LeetCode]13. Roman to Integer羅馬數字轉整數