文巾解题 13. 罗马数字转整数
生活随笔
收集整理的這篇文章主要介紹了
文巾解题 13. 罗马数字转整数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 題目描述
2 解題思路
2.1 模擬
通常情況下,羅馬數字中小的數字在大的數字的右邊。若輸入的字符串滿足該情況,那么可以將每個字符視作一個單獨的值,累加每個字符對應的數值即可。
例如XXVII 可視作 X+X+V+I+I=10+10+5+1+1=27。
若存在小的數字在大的數字的左邊的情況,根據規則需要減去小的數字。對于這種情況,我們也可以將每個字符視作一個單獨的值,若一個數字右側的數字比它大,則將該數字的符號取反。
例如XIV 可視作X?I+V=10?1+5=14。
那么我們就從字符串的串頭開始遍歷,同時我們比較除最后一位以外的其他位與后一位之間的大小。如果當前位羅馬數字對應的數字比后一位的小,那么總的數字結果就減去這一位,否則加上這一位。
class Solution:SYMBOL_VALUES = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,} #每個羅馬數字對應的數字def romanToInt(self, s: str) -> int:ans = 0n = len(s)for i, ch in enumerate(s):value = Solution.SYMBOL_VALUES[ch]if i < n - 1 and value < Solution.SYMBOL_VALUES[s[i + 1]]: #如果當前位比后一位小,那么說明這一位要減掉ans -= valueelse:ans += valuereturn ans2.2 兩位兩位比較
?大致的思路就是,先把所有可能的值都存入一個字典里面
兩位羅馬數字對應的數字,我們賦值為:兩位羅馬數字應該的值-兩位羅馬數字第一位的值
?
然后我們就累加就可以了
?
dict.get(a,b):如果找得到a的話,返回a的鍵值,否則,返回b
這里我們每次都是檢索當前位置和他前面一個位置兩個元素,拼接起來看在不在字典里面,在的話累加,不在的話,就加上這個位置羅馬數字所對應的值。
?
比如XIV,檢索X的時候,返回10;檢索XI的時候,因為找不到XI這個兩位羅馬數字,返回I的值,1,在檢索IV的時候,有這個鍵值對,所以返回IV的3——加上之前I的1,IV的4就計算出來了?
class Solution:def romanToInt(self, s: str) -> int:dic={'I':1,'IV':3,'V':5,'IX':8,'X':10,'XL':30,'L':50,'XC':80,'C':100,'CD':300,'D':500,'CM':800,'M':1000} #所有合法的一位&兩位羅馬數字number=0;for i,n in enumerate(s):number=number+dic.get(s[max(i-1,0):i+1],dic[n]) #如果兩位羅馬數字存在,那么就返回兩位羅馬數字(當前位&前一位)對應的數字 #否則,返回當前位羅馬數字對應的數字return(number)?
總結
以上是生活随笔為你收集整理的文巾解题 13. 罗马数字转整数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 12. 整数转罗马数字
- 下一篇: 文计笔记 5 网络