leetCode 12. Integer to Roman

刷到了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ī)律,就很好寫了

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

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

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