Problems:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
思路:
羅馬數字就有下面七個基本符號:Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)羅馬數字與十進位數字的意義不同,它沒有表示零的數字,與進位制無關。
計數規則:
1.若干相同數字連寫表示的數是這些羅馬數字的和,如III=3;
2.小數字在大數字前面表示的數是用大數字減去小數字,如IV=4;
3.小數字在大數字后面表示的數是用大數字加上小數字,如VI=6;
組合規則:
(1)基本數字Ⅰ、X 、C 中的任何一個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用一個。
(2)不能把基本數字 V 、L 、D 中的任何一個作為小數放在大數的左邊采用相減的方法構成數目;放在大數的右邊采用相加的方式構成數目,只能使用一個。
(3)V 和 X 左邊的小數字只能用Ⅰ。
(4)L 和 C 左邊的小數字只能用×。
(5)D 和 M 左 邊的小數字只能用 C 。
以MCMXXC為例,第1位上的C比第0位上的M小,所以先加了一次,但其實在計算中應該是第2位上的M減去第一位上的C。所以在我們的循環中,其實應該減去兩次C。
1.首先應該建立一個字典:def_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
2.設一個常數為0(也就是我們最后轉換后的數字)x=0
3.設置循環來轉換數字:
循環應該在range(0,len(s))中,也就是0,1,2,。。。len(s)-1.☆
當i=0或者當前位小于等于前一位時,直接加上當前位
否則,就要加上當前位并減去兩倍的前一位
最后的代碼為:
class Solution(object):
def romanToInt(self, s):
#Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)
#當符號Ⅰ、Ⅹ或C位于大數的后面時就作為加數;位于大數的前面就作為減數。
? ? def_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
? ? x=0
? ?for i in range(0,len(s)):
? ? ? ?if i==0 or def_dict[s[i]]<= def_dict[s[i-1]]:
? ? ? ? ? ? x+= def_dict[s[i]]
? ? ? ?else:
? ? ? ? ? ? x+= def_dict[s[i]]-2*def_dict[s[i-1]]
? return x
大神的方法:
classSolution:
# @param {string}s#
?@return {integer}
def romanToInt(self, s):
? ? ? roman = {'M':1000,'D':500,'C':100,'L':50,'X':10,'V':5,'I':1}? ?
? ? ? z =0
? ? ?for i in range(0, len(s) -1):
? ? ? ? ? if roman[s[i]] < roman[s[i+1]]:? ? ? ? ? ?
? ? ? ? ? ? ? ? ? z -= roman[s[i]]
? ? ? ? ? else:? ? ? ? ? ?
? ? ? ? ? ? ? ? ? z += roman[s[i]]
? ?return ?z + roman[s[-1]]
關鍵在于最后一位肯定是加的,那么前面的該減減,該加加,不需要另外考慮i=0的情況。
以下為阿拉伯數字轉化為羅馬數字:
在上述的組合規則中需要注意的是:
小數在大數左邊只能有1位,且XL,XC,CD,CM,IV,IX是固定且唯一可能出現的小數在前面的組合?。。?/b>
num_list = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
str_list = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']
代碼如下:使用一個for循環與阿拉伯數字進行比較即可。其中注意字符串的初始化。
def IntToRoman(x):
#把所有可能的數的可能組合列舉出來
? ? s=''
? ? num_list = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
? ? str_list = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']
? ? for i in range(0,len(num_list)):
? ? ? ? ? if x >= num_list[i]:
? ? ? ? ? ? ? ?x-= num_list[i]
? ? ? ? ? ? ? ?s+= str_list[i]
? ? ? return s