刷到了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.
這個(gè)題的中文意思就是給定一個(gè)數(shù)字(從1到3999)將這個(gè)數(shù)字轉(zhuǎn)化成羅馬數(shù)字并輸出
首先思路就是研究一下羅馬數(shù)字的寫法,說(shuō)來(lái)慚愧浇借,我一直以為羅馬數(shù)字只有10個(gè)
“I” "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X"
后來(lái)經(jīng)過(guò)查找捉撮,羅馬數(shù)字是有規(guī)律的
羅馬數(shù)字總共有7個(gè)
“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’
加最多到三 這個(gè)就不用過(guò)多解釋了
有了這個(gè)思路后我們就可以開始代碼了
首先我們把上面給的字母分組 我的分組方式 是I自己一組,剩下的兩個(gè)一個(gè)分組
#分組最后空出一組骑素,是因?yàn)樽詈蠓乐钩霈F(xiàn)數(shù)組越界
roman_array = [['V','X'],['L','C'],['D','M'],['','']]
#下一步就是按位數(shù)將數(shù)字取出了炫乓,這一步我是將數(shù)字轉(zhuǎn)成字符,并逐位取出
str = '%d'%(num)
count = len(str)
real_str = ''
#當(dāng)還有剩余位數(shù)時(shí)
while count > 0:
#取出對(duì)應(yīng)數(shù)字
head_num = int(str[len(str) - count])
#當(dāng)當(dāng)前位數(shù)為第一位時(shí)(也就是認(rèn)為取出的是個(gè)位數(shù)時(shí))給字符串?dāng)?shù)組賦值為空(此數(shù)組為當(dāng)前數(shù)組單位)
sub_array = ['', ''] if count - 2 < 0 else roman_array[count - 2]
#數(shù)組為下一位進(jìn)制數(shù)組(因當(dāng)前數(shù)字為9時(shí)献丑,需要使用下一位數(shù)的十位數(shù)字母末捣,如果為9則需要顯示‘IX’)
append_array = roman_array[count - 1]
#在這個(gè)地方,判斷了下是否大于5创橄,因如果大于5則前需要加上一個(gè)5進(jìn)制符號(hào)箩做,通過(guò)角標(biāo)獲取
index = 1 if head_num > 5 else 0
#剩下就是將這個(gè)數(shù)字轉(zhuǎn)化成5及5已下的字符了
real_head = head_num - 5 if head_num > 5 else head_num
#當(dāng)情況為4、5的時(shí)候情況單獨(dú)羅列
if real_head == 4:
real_str += sub_array[1]
#判斷這個(gè)時(shí)候有無(wú)進(jìn)制位數(shù)筐摘,若無(wú)進(jìn)制數(shù)卒茬,則補(bǔ)充進(jìn)制數(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:
#在這個(gè)情況判斷是大于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
最后這個(gè)real_str 就是我們需要的字符了,直接return 就好了
做這道題的時(shí)候咖熟,錯(cuò)了好多遍圃酵,思路也是不斷的在變化,最后才成功寫出了這個(gè)羅馬數(shù)字的題馍管,題并不難郭赐,只要知道了規(guī)律,就很好寫了