leetCode 12. Integer to Roman

刷到了leetCode的第12道題,這道題很有意思,前前后后寫(xiě)了好久,并不難,主要是數(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ù)字的寫(xiě)法,說(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è)思路后我們就可以開(kāi)始代碼了
首先我們把上面給的字母分組 我的分組方式 是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ò)了好多遍,思路也是不斷的在變化,最后才成功寫(xiě)出了這個(gè)羅馬數(shù)字的題,題并不難,只要知道了規(guī)律,就很好寫(xiě)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容