字元 數值通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況: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 。
i
可以放在v (5)
和x (10)
的左邊,來表示4
和9
。
x
可以放在l (50)
和 c (100) 的左邊,來表示40
和90
。
c
可以放在d (500)
和m (1000)
的左邊,來表示400
和900
。
給定乙個整數,將其轉為羅馬數字。輸入確保在1
到3999
的範圍內。
示例 1:
輸入: 3示例 2:輸出: 「iii」
輸入: 4示例 3:輸出: 「iv」
輸入: 9示例 4:輸出: 「ix」
輸入: 58示例 5:輸出: 「lviii」
解釋: l = 50, v = 5, iii = 3.
輸入: 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。通常情況下,羅馬數字中小的數字在...