leetcode刷題筆記之羅馬數字轉化爲數字

leetcode刷題筆記之羅馬數字轉化爲數字

題目信息

題目地址:https://oj.leetcode.com/problems/roman-to-integer/

題目要求

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

相關資料

我的答案

class Solution:
    symbols = ['I','V','X','L','C','D','M']
    values = [1, 5, 10, 50, 100, 500, 1000]
    symbol_list = []
    value_list = []
    for i in range(len(symbols)/2):
        index = i*2
        symbol_list.extend([symbols[index]*j for j in range(1,4)])    # I, II, III
        value_list.extend([values[index]*j for j in range(1,4)])
        symbol_list.append(symbols[index]+symbols[index+1]) # IV
        value_list.append(values[index+1]-values[index])
        symbol_list.append(symbols[index+1]) # V
        value_list.append(values[index+1])
        symbol_list.extend([symbols[index+1]+symbols[index]*j for j in range(1,4)])    # VI, VII, vIII
        value_list.extend([values[index+1]+values[index]*j for j in range(1,4)])
        symbol_list.append(symbols[index]+symbols[index+2]) # IX
        value_list.append(values[index+2]-values[index]) # IX
    symbol_list.extend(['M','MM','MMM'])
    value_list.extend([1000, 2000, 3000])
    roman_map = dict(zip(symbol_list,value_list))

    # @return an integer        
    def romanToInt(self, s):
        result = 0
        for symbol in self.symbol_list[::-1]:
            if s.find(symbol) == 0:
                result += self.roman_map[symbol]
                s = s[len(symbol):]
        return result

if __name__ == '__main__':
    s = Solution()
    print s.romanToInt('XCVII')

思路:

  1. 將每一個單位字符代表的數字列出來,排序後放在symbol_list中,將映射關係放在roman_map裏。即羅馬字符表爲['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M', 'MM', 'MMM'],對應的數字爲[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 2000, 3000]
  2. 拿到羅馬字符後,從後往前遍歷羅馬字符表,若找到對應的字符則移除該字符,並將結果加入數字中。如此循環,知道所有羅馬字符被遍歷完。
  3. 在類中寫的代碼只需執行一次,可以將得到的羅馬字符表拿出來,直接放進程序裏。此處爲保留過程留了下來。
  4. 該思路未對錯誤的羅馬字符進行處理,很多實現上不如docutils中的解決方案,讀者可參考那個版本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章