LeetCode 13 Roman to Integer (easy)——python

 題目來源:

 題目分析:

1.羅馬數字介紹

     本題需要對題目意思進行一定的解讀,首先需要了解羅馬數字的計數情況。
     羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的規則可以表示任意正整數。需要注意的是羅馬數字中沒有“0”,與進位制無關。一般認爲羅馬數字只用來記數,而不作演算。

    重複數次:一個羅馬數字重複幾次,就表示這個數的幾倍。

    右加左減:在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。

     (1)左減的數字有限制,僅限於I、X、C。比如45不可以寫成VL,只能是XLV。
     (2)但是,左減時不可跨越一個位數。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同於阿拉伯數字每位數字分別表示。)
    (3)左減數字必須爲一位,比如8寫成VIII,而非IIX。
    (4)右加數字不可連續超過三位,比如14寫成XIV,而非XIIII。(見下方“數碼限制”一項。)

    加線乘千在羅馬數字的上方加上一條橫線或者加上下標的Ⅿ,表示將這個數乘以1000,即是原數的1000倍。同理,如果上方有兩條橫線,即是原數的1000000(1000^{2})倍。
    數碼限制同一數碼最多隻能出現三次,如40不可表示爲XXXX,而要表示爲XL。

2.本題思路:

    由於在較大羅馬數字的右邊記上一個較小的羅馬數字,表示大數字加上小數字,我們可以將羅馬字符先進行翻轉,從小數字開始相加,如果不存在相減的情況,則應該是從小到大排列的,例如(VI V=5,I=1,VI=6,將其翻轉過來疊加也是6)。如果原數字是相減的情況,例如(IV V=5,I=1,IV=5-1=4),則將其翻轉時變成了(VI)先疊加了V,如果不採取措施,則下一步會疊加I,造成答案的錯誤,因此這裏我們可以使用一個變量last將每次疊加的數字記錄下來,這裏是記錄V,如果下一次的變量小於這次的(這裏指I)。則可以減去2倍的該變量(I),然後將該變量給累加上,相當於做了減法。這種方法比較巧妙,值得學習!!

3.實驗結果:

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        dic={"M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1}
        last=None
        s=s[::-1]
        sum=0
        for key in s:
            if (last and dic[key]<last):
                sum-=2*dic[key]
            sum+=dic[key]
            last=dic[key]
        return sum

這裏要注意將last設置爲None,它是一種特殊的數據類型,代表一個空值而不能認爲它是0,因爲0是有意義的。你可以將None賦值給任何對象,也可以將任何變量賦值給一個None值的對象。而判斷得等last有值了再進行判斷。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章