leetcode問題解|Roman to Integer問題


problem:
Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

ローマ数字を整数に変換
thinking:
(1)ローマ数字規則:
ローマ数字は全部で7つあり、すなわち、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)である.任意の正の整数を下記の規則で表すことができる.なお、ローマ数字には「0」はない、キャリー制とは関係ありません.ローマ数字は演算ではなく記数にしか使われないと考えられています.数回繰り返す:1つのローマ数字が数回繰り返されると、この数の数の数倍を表します.右プラス左マイナス:大きなローマ数字の右に小さいローマ数字を記入し、大きな数字に小さい数字を加えることを示します.大きなローマ数字の左側に小さいローマ数字を記入し、大きな数字が数字を減らすことを示します.左マイナスの数字には制限があり、I、X、Cに限られています.例えば45はVLではなくXLVでしか書けませんが、左マイナスでは1桁を越えてはいけません.たとえば、99はIC(100-1)ではなく、XCIX([100-10]+[10-1])で表されます.(アラビア数字は1桁ごとに表示されます.)左マイナスは1桁でなければなりません.例えば、8はIIXではなくVIIIで書かれています.右プラスは3桁を連続的に超えてはいけません.例えば、14はXIIIではなくXIVで書かれています.(下の「デジタル制限」を参照))も参照してください.加線乗千:ローマ数字の上に横線を付けるか、下付きの同様に、上に2本の横線がある場合、原数の100000(1000^{2})倍である.デジタル制限:同一のデジタルは最大3回しか現れない.例えば40はXXXXではなくXLである.例外:IVは古代ローマ神話の主神ジュピット(IVPITER、グローマアルファベットにはJとUがない)の頭字であるため、IVIIでIVの代わりに使われることがある.
code:
class Solution {
public:
    int romanToInt(string s) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        int result=0;
        
        map<char,int> roman;
        roman['I']=1;
        roman['V']=5;
        roman['X']=10;
        roman['L']=50;
        roman['C']=100;
        roman['D']=500;
        roman['M']=1000;
        
        for(int i=s.length()-1;i>=0;i--)
        {
            if(i==s.length()-1)
            {
                result=roman[s[i]];
                continue;
            }
            if(roman[s[i]] >= roman[s[i+1]])
                result+=roman[s[i]];
            else
                result-=roman[s[i]];
        }
        return result;
    }
};