Leetcode---ローマ数回転整数(Python 3実装)

1801 ワード

Leetcode-ローマ数回転整数
(半日かかったが、結局できなかった.心が疲れた~~~ネットユーザーの解題の考え方に頼るしかない)
ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています.
例えば、ローマ数字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
    例3:
    入力:「IX」出力:9
    例4:
    入力:「LVIII」出力:58
    説明:L=50,V=5,III=3.
    例5:
    入力:「MCMXCIV」出力:1994
    説明:M=1000、CM=900、XC=90、IV=4.
    ネットユーザーの2つの解法:
    第1種
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    def romanToInt(s):
        a = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        ans = 0
        for i in range(len(s)):
    
            if i < len(s) - 1 and a[s[i]] < a[s[i + 1]]:
                ans -= a[s[i]]
            else:
                ans += a[s[i]]
        return ans
    

    第2種
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    class Solution:
        def romanToInt(self, s: str) -> int:
            dic = {
                "I":1,
                "V":5,
                "X":10,
                "L":50,
                "C":100,
                "D":500,
                "M":1000
            }
            ans = 0
            for i, char in enumerate(s[:-1]):
                if dic[char] >= dic[s[i+1]]:
                    ans += dic[char]
                else:
                    ans -= dic[char]
            ans += dic[s[-1]]
            return ans