LeteCode 12 整數轉羅馬數字

2021-10-01 08:45:05 字數 2555 閱讀 9275

字元 數值

i 1

v 5x 10

l 50

c 100

d 500

m 1000

例如, 羅馬數字 2 寫做 ii ,即為兩個並列的 1。12 寫做 xii ,即為 x + ii 。 27 寫做 xxvii, 即為 xx + v + ii 。

通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況:

i可以放在v (5)x (10)的左邊,來表示49

x可以放在l (50)和 c (100) 的左邊,來表示4090

c可以放在d (500)m (1000)的左邊,來表示400900

給定乙個整數,將其轉為羅馬數字。輸入確保在13999的範圍內。

示例 1:

輸入: 3

輸出: 「iii」

示例 2:

輸入: 4

輸出: 「iv」

示例 3:

輸入: 9

輸出: 「ix」

示例 4:

輸入: 58

輸出: 「lviii」

解釋: l = 50, v = 5, iii = 3.

示例 5:

輸入: 1994

輸出: 「mcmxciv」

解釋: m = 1000, cm = 900, xc = 90, iv = 4.

解題思路

找規律:

根據題意,每次發生不同變化的是在中間數5附近和末位數9上。

所以可以按每個位進行分析情況,然後乙個標誌位:bei 記錄當前分析位的等級,比如個位是1,十位是10,百位是100這樣遞增

單個位的情況分為4種5段:0-3,4,5,6-8,9

每種情況對應各自的編碼規則,詳細見下列**

class

solution

:def

inttoroman

(self, num:

int)

->

str:

#分析情況

#數量級分為 個位,十位 百位 逐位分析

#每個位的數範圍是0-9,根據題意總共可以分位五種情況 0-4,5,6,7-8,9

#建立字典

zidian=

re=''# 記錄結果

bei=

1# 用來表示當前位數是什麼數量級的 比如個位是1 十位就是10 百位就是100

while

(num>0)

:# 當全部取完就跳出迴圈

w=num%

10# 取最右邊位上的數 #

num//=

10# 數字右移

# f表示轉化後的羅馬數(單個位)

if w<4:

#0 1 2 3 分情況

f=zidian[bei]

*w elif w==4:

f= zidian[bei]

+zidian[

5*bei]

elif w==5:

f= zidian[

5*bei]

elif w==9:

f=zidian[bei]

+zidian[

10*bei]

else

: f= zidian[

5*bei]

+zidian[bei]

*(w-5)

re=f+re # 將此次結果新增上

bei*=

10# 數量級逐漸增加

return re

執行用時 :40 ms, 在所有python3提交中擊敗了99.90%的使用者

記憶體消耗 :12.7 mb, 在所有python3提交中擊敗了99.54%的使用者

12 整數轉羅馬數和13 羅馬數轉整數

題目的給出了幾種轉換策略,以及在個位是4,6的時候有一些變換。首先乙個整數num的範圍是1 3999,數字的位數情況是 千位,百位,十位,個位。每一位的數字其實就有四種情況,以百位為例 100,300 是一類 400是一類 500,800 是一類 900是一類 整個演算法上沒什麼特別困難的比較好理解...

12 整數轉羅馬數字

羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中...

12 整數轉羅馬數字

一 題目 羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元數值i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅馬數字中小的數字在...