leetcode: 13.Roman to Integer(羅馬數字轉整數)

問題分析

1、羅馬數字特點

一般情況下大的字母排在前面,小的字母排在後面,此時進行的是加法(如: VI=5+1=6);特殊情況:小的字母排在前面,大的字母排在後面,此時進行的是減法(如:IV=5-1=4)。

一般情況 + 特殊情況(映射關係》數據類型dict):

 roman = {
            'I': 1,
            'V': 5,
            'X': 10,
            'L': 50,
            'C': 100,
            'D': 500,
            'M': 1000,
            'IV': 4,
            'IX': 9,
            'XL': 40,
            'XC': 90,
            'CD': 400,
            'CM': 900
        }

2、字符串解析

輸入的是字符串,所以可以使用for循環進行迭代。一般情況下,字符串迭代每次只能獲取到一個字母。

如果這些字母剛好全都是(I, V, X, L, C, D, M)裏面的,那麼只要把結果相加即可。

但是如果包含(IV, IX, XL, XC, CD, CM)裏面的任意一個怎麼辦?當然是希望既能取到前一個值,同時也能取到後一個值,這樣就可以對兩個值進行比較,判斷是否需要進行減法計算。循環在Python裏面有:

(1)for循環

正序:

class Solution(object):
    def roman_to_int(self, s):
        """
        :type s: str
        :rtype: int
        """
        roman = {
            'I': 1,
            'V': 5,
            'X': 10,
            'L': 50,
            'C': 100,
            'D': 500,
            'M': 1000,
        }
        total = 0
        prev = 0
        for i in range(len(s)):
            curr = roman.get(s[i])
            if prev < curr:
                total -= curr - 2*prev
            else:
                total += curr
        return total

(2)while

class Solution(object):
    def roman_to_int(self, s):
        """
        :type s: str
        :rtype: int
        """
        roman = {
            'I': 1,
            'V': 5,
            'X': 10,
            'L': 50,
            'C': 100,
            'D': 500,
            'M': 1000,
        }
        total = 0
        i = 0
        prev = 0
        while i < len(s):
            curr = roman.get(s[i])
            if prev < curr:
                total += curr - 2*prev
            else:
                total += curr
            i = i+1
            prev = curr
        return total

時間複雜度分析

O(n)。

Python知識點

[1]遍歷:for循環,while循環,這兩種循環總是可以互相切換的,即一般來說,可以用for循環實現的,那麼一般也能用while循環實現。

[2]序列類型的切片操作。序列類型的遍歷,往往也會涉及到正序和倒序,倒序可以使用切片操作符快速構造。

[3]內建函數enumerate(), range()。這兩個函數循環的時候往往會用到。

參考資料

[1]leetcode, https://leetcode.com/problems/roman-to-integer/

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