Leetcode題目記錄 整數轉羅馬數字(2)

2021-09-14 06:40:22 字數 2766 閱讀 2774

[

羅馬數字包含以下七種字元: i, v, x, l,c,d 和 m。

字元數值i1

v5x10

l50c100

d500

m1000

例如, 羅馬數字 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) 的左邊,來表示 4 和 9。

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

c 可以放在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。

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

示例示例1

輸入: 3

輸出: 「iii」

示例 2:

輸入: 4

輸出: 「iv」

示例 3:

輸入: 9

輸出: 「ix」

示例 4:

輸入: 58

輸出: 「lviii」

示例 5:

輸入: 1994

輸出: 「mcmxciv」

本題目的將阿拉伯數字轉化成羅馬數字,而千位、百位、十位、個位上的數字都對應著不同的羅馬字元,需要對不同位置上的數字進行處理,思路如下:

(甲)

(1)建立阿拉伯數字和羅馬字元之間的字典;

(2)將輸入值按照所在位置分解成多個數,比如:3214分解成:3000,200,10,4

(3)用分解後的四個數字分別匹配字典中對應的羅馬字元:3000:「mmm」,200:「ccc」,10:「x」,4:「iv」

(4)將匹配好的羅馬字串在一起得到最終結果。

(乙)

(1) 將不同位數上羅馬數字的組成元素存放在不同的列表中;

(2) 將輸入值按照所在位置分解成多個數,比如:3214分解成:3000,200,10,4;

(3) 對各位上的數字選取相應的表示方法,再進行組合。

# 自己解法

#(甲)

class

solution

:def

inttoroman

(self, num:

int)

->

str:

dict

= b =

[1000

,100,10

,1] res =

for i in b:

if num/i >1:

dict

[(num//i)

*i])

num = num % i

return

"".join(res)

#(乙)

class

solution

:def

inttoroman

(self, num:

int)

->

str:

l =s =[[

'i',

'v'],[

'x',

'l'],[

'c',

'd'],[

'm']

] p =

for i in

range(1

,5):

t = num%(10

**i)

num-=t

for i in

range

(len

(l)-1,

-1,-

1): k = l[i]/(

10**i)

if k in(1

,2,3

):int(k)

*s[i][0

])elif k in(5

,6,7

,8):

[1]+

int(k-5)

*s[i][0

])elif k==4:

[0]+s[i][1

])elif k==0:

'')else:[

0]+s[i+1]

[0])

return(''

.join(p)

)# 網上最優解法

class

solution

:def

inttoroman

(self, num:

int)

->

str:

res =

'' dict_romans =

for key in dict_romans:

if num // key >=1:

res += dict_romans[key]

*(num // key)

num = num % key

return res

(1)// :表示整除的值

(2)% :表示除完後的餘數

(3)dict[key] :字典使用方式,用key表示value

(4) 最優解法使用了阿拉伯數字和羅馬字元間更強的規律,我是很難總結出這個規律,可以用列舉法去總結。

leetcode記錄 羅馬數字轉整數

羅馬數字包含以下七種字元 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。通常情況下,羅馬數字中小的數字在大的數字的...

leetcode記錄 字串轉整數(atoi)

實現atoi,將字串轉為整數。在找到第乙個非空字元之前,需要移除掉字串中的空格字元。如果第乙個非空字元是正號或負號,選取該符號,並將其與後面盡可能多的連續的數字組合起來,這部分字元即為整數的值。如果第乙個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。字串可以在形成整數的字元後面包...

LeetCode 其他題目記錄

104.maximum depth of binary tree 和111很像,只是遞迴的結構略有不同,可簡單畫圖分析,求最大深度可以直接返回1 max 左子樹深度,右子樹深度 但是求最小深度時不可以,需要分別考慮左右子樹為空的情況。可以舉個反例子,比如,單斜樹。1 class solution 7...