解題構想-leetcode第12題:整数回転ローマ数字

5480 ワード

解題構想-leetcode第12題:整数回転ローマ数字
タイトルの説明:ローマ数字は以下の7種類の文字を含みます:I、V、X、L、C、DとM.文字値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:入力:3出力:「III」例2:入力:4出力:「IV」例3:入力:9出力:「IX」例4:入力:58出力:「LVIII」解釈:L=50,V=5,III=3.例5:入力:1994出力:「MCMXCIV」解釈:M=1000、CM=900、XC=90、IV=4.この問題は辞書を使って解題するのに適しています.まず辞書を構築します.1,4,5,9,10,40,50,9010040050900000,1000が含まれています.その後、辞書のkeyを降順に並べ替え、辞書を巡り、各keyについて入力値で除算し、得られた値はこのkeyが使用された回数を表し、そのkeyの値と回数を乗算して文字列に加え、入力をkeyから減算して次のラウンドをループします.最後に文字列を返します.コードは次のとおりです.
class Solution:
    def intToRoman(self, num: int) -> str:
        numk={1:'I',
            4:'IV',
            5:'V',
            9:'IX',
            10:'X',
            40:'XL',
            50:'L',
            90:'XC',
            100:'C',
            400:'CD',
            500:'D',
            900:'CM',
            1000:'M' }
        res=""
        for key in sorted(numk.keys(), reverse=True):
            if(num==0):
                break
            t =num//key
            if(t==0):
                continue
            res+=numk[key]*t
            num-=key*t
        return res

提出後、通過します.