[LeetCode]Roman to Integer

1802 ワード

タイトルの説明
Given a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999.
ローマ数字を整数に変換します.入力保証は1~3999の範囲です.
問題を解く構想.
ローマ数字の基本文字:
  I、V、X、L、C、D、M
対応するアラビア数字は次のように表されます.
  1.5、10、50、100、500、1000
(1)同一の数字を連続して書き、表す数はこれらの数字を加算した数に等しい.例えば、III=3;
(2)小さい数字は大きい数字の右側にあり、表す数はこれらの数字を加算した数に等しい.例えば、VIII=8;Ⅻ = 12;
(3)小さい数字、(I,X,Cに限る)大きい数字の左側で、表す数は大きい数から小数を減らして得た数に等しい.例えば、IV=4;Ⅸ=9;
(4)通常の使用時に連続して書かれた数字を3回以上繰り返してはならない.(文字盤の4時--「III」、例外.)
(5)1つの数の上に横線を引いて、この数が1000倍になることを示します.
ローマ数字は純粋に重畳されていることがわかり,ユーザが1つの数を入力すると,この数を遍歴しsumで合計し,iとi+1を比較すると法則が得られる.
コード#コード#
public class Solution {
    public int romanToInt(String s) {
        if(s.length() < 1) return 0;
        int sum = 0;
        int sub = getRomanValue(s.charAt(0));
        int lastInt = sub;
        for(int i = 1;i < s.length();i++){
            char curC = s.charAt(i);
            int curInt = getRomanValue(curC);
            
            if(curInt < lastInt){
                sum += sub;  
                sub = curInt; 
            } else if(curInt > lastInt){
                sub = curInt - sub;
            } else if(curInt == lastInt){
                 sub += curInt;  
            }
            lastInt = curInt;
        }
        sum += sub;  
        return sum; 
    }
    
    public int getRomanValue(char c) {  
        switch(c) {  
            case 'I': return 1;   
            case 'V': return 5;  
            case 'X': return 10;  
            case 'L': return 50;  
            case 'C': return 100;  
            case 'D': return 500;  
            case 'M': return 1000;  
            default: return 0;  
        }  
    }  
}