leetcode-13ローマ数字を整数python 3に変換


ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています.
文字数
I              1
V             5
X             10
L              50
C             100
D             500
M            1000
例えば、ローマ数字2はIIと書かれており、2つの並列の1である.12はXII、すなわちX+IIと書く.27はXXVII、すなわちXX+V+IIと書く.
通常、ローマ数字の中で小さい数字は大きな数字の右側にあります.しかし、例えば4はIIIではなくIVと書くという特例もある.数字1は数字5の左で、表す数は大きい数5が小数1を減らして得た数値4に等しい.同様に、数字9はIXとして表される.この特殊なルールは、次の6つの場合にのみ適用されます.
  • Iは、V(5)およびX(10)の左側に配置され、4および9を表すことができる.
  • XはL(50)とC(100)の左側に置いて40と90を表すことができる.
  • CはD(500)とM(1000)の左側に置いて400と900を表すことができる.
  • ローマ数字を指定し、整数に変換します.入力は1~3999の範囲であることを確認します.
    例1
    入力:「III」
    出力:3
    例2
    入力:「IV」
    出力:4
    この問題を見終わって、まず辞書で以下のIからMの数値を保存して、便利になってからインデックスを考えます.そしてI,X,Cは3つの特殊なケースです(例えばVIは5+1=6で加算をします;IVは5-1=4で減算をします).だから、1文字ずつアルファベットを認識するときは前のアルファベットと加算をするか減算をするかを考えるだけです.入力した文字列がローマ数字ではないと判断させるという問題はありませんので、入力がルールに合っていると仮定します(すなわち、DがMの左側にあるような場合はない):
    class Solution:
        def romanToInt(self, s):
            """
            :type s: str
            :rtype: int
            """
             r_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
            num = r_dict[s[0]]
            sum = 0
            if len(s) == 1:
                print(num)
            else:
                for i in s[1:]:
                    if r_dict[i] <= num:
                        sum += num
                    else:
                        sum -= num
                    num = r_dict[i]
                sum += num
            return(sum)

    もちろん、最も原始的な方法を利用してもいいです.一つの判断状況です.
    class Solution:
        def romanToInt(self, s):
            """
            :type s: str
            :rtype: int
            """
            
            i = 0
            num = 0
            while i