刷到了leetCode的第12道題,這道題很有意思,前前后后寫了好久,并不難,主要是數(shù)字轉(zhuǎn)換。
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
這個題的中文意思就是給定一個數(shù)字(從1到3999)將這個數(shù)字轉(zhuǎn)化成羅馬數(shù)字并輸出
首先思路就是研究一下羅馬數(shù)字的寫法,說來慚愧,我一直以為羅馬數(shù)字只有10個
“I” "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X"
后來經(jīng)過查找,羅馬數(shù)字是有規(guī)律的
羅馬數(shù)字總共有7個
“I” "V" "X" "L" "C" "D" "M"
分別是1,5,10,50,100,500,1000
首先羅馬數(shù)字遵循的原理是
‘左減右加’
‘加最多到三’
解釋一下,左減右加: VI 是 6 可以看做 ‘5+1’ 也就是 ‘V+I’ IV 是 4 可以看做‘5-1’ 也就是‘I-V’
加最多到三 這個就不用過多解釋了
有了這個思路后我們就可以開始代碼了
首先我們把上面給的字母分組 我的分組方式 是I自己一組,剩下的兩個一個分組
#分組最后空出一組,是因為最后防止出現(xiàn)數(shù)組越界
roman_array = [['V','X'],['L','C'],['D','M'],['','']]
#下一步就是按位數(shù)將數(shù)字取出了,這一步我是將數(shù)字轉(zhuǎn)成字符,并逐位取出
str = '%d'%(num)
count = len(str)
real_str = ''
#當還有剩余位數(shù)時
while count > 0:
#取出對應數(shù)字
head_num = int(str[len(str) - count])
#當當前位數(shù)為第一位時(也就是認為取出的是個位數(shù)時)給字符串數(shù)組賦值為空(此數(shù)組為當前數(shù)組單位)
sub_array = ['', ''] if count - 2 < 0 else roman_array[count - 2]
#數(shù)組為下一位進制數(shù)組(因當前數(shù)字為9時,需要使用下一位數(shù)的十位數(shù)字母,如果為9則需要顯示‘IX’)
append_array = roman_array[count - 1]
#在這個地方,判斷了下是否大于5,因如果大于5則前需要加上一個5進制符號,通過角標獲取
index = 1 if head_num > 5 else 0
#剩下就是將這個數(shù)字轉(zhuǎn)化成5及5已下的字符了
real_head = head_num - 5 if head_num > 5 else head_num
#當情況為4、5的時候情況單獨羅列
if real_head == 4:
real_str += sub_array[1]
#判斷這個時候有無進制位數(shù),若無進制數(shù),則補充進制數(shù)為‘I’
if len(sub_array[1]) == 0:
real_str += 'I'
real_str += append_array[index]
elif real_head == 5:
real_str += append_array[index]
else:
#在這個情況判斷是大于5或者小于5
if index > 0:
real_str += append_array[0]
#用遍歷的方式添加字符
for i in range(0, real_head):
real_str += sub_array[1]
if len(sub_array[1]) == 0:
real_str += 'I'
count -= 1
最后這個real_str 就是我們需要的字符了,直接return 就好了
做這道題的時候,錯了好多遍,思路也是不斷的在變化,最后才成功寫出了這個羅馬數(shù)字的題,題并不難,只要知道了規(guī)律,就很好寫了