LeetCode Roman to Integer(013)解法總結

NewCoder1024發表於2020-03-19

描述

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.複製程式碼

思路

這道題是LeetCode第12題的逆向應用,不過是更簡單的版本,因為不涉及給出的情況之外的羅馬字元,即使用題目中給出的字元,加上判斷字元代表的大小位置關係(左大右小時將左邊的數字加到sum上;左小右大時用右邊的資料減去左邊的資料,再將結果加到sum上)。

class Solution {
    public int romanToInt(String s) {
        int sum = 0;

        //使用map儲存對應的字母和數字,省去遍歷的操作
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        map.put('M', 1000);
        map.put('D', 500);
        map.put('C', 100);
        map.put('L', 50);
        map.put('X', 10);
        map.put('V', 5);
        map.put('I', 1);
        
        //新增兩個變數,一個代表當前的字元,另一個提前讀取下一個字元
        int curr = 0, next = 0;
        for(int i = 0; i<s.length(); i++){
            //當前字元為最後一個字元時
            if(i == s.length() - 1){
                curr = map.get(s.charAt(i));
                sum = sum + curr;
            }else{
                curr = map.get(s.charAt(i));
                next = map.get(s.charAt(i+1));
                
                //當前字元是給出的字符集中的(左大右小)
                if(curr >= next){
                    sum = sum + curr;
                }else{
                    //左小右大
                    sum = sum - curr + next;
                    i++;
                }
            }
        }
        return sum;
    }   
}複製程式碼
Runtime: 5 ms, faster than 62.51% of Java online submissions for Roman to Integer.
Memory Usage: 41.6 MB, less than 5.48% of Java online submissions for Roman to Integer.

只需要遍歷字串一次,效率比較高。

相關文章