LeetCode刷題之旅 13 羅馬數字轉整數

2021-10-05 20:27:57 字數 1585 閱讀 9582

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

字元 數值

i 1v 5

x 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) 的左邊,來表示 4 和 9。

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

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

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

示例 1:

輸入: 「iii」

輸出: 3

示例 2:

輸入: 「iv」

輸出: 4

示例 3:

輸入: 「ix」

輸出: 9

示例 4:

輸入: 「lviii」

輸出: 58

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

示例 5:

輸入: 「mcmxciv」

輸出: 1994

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

題解:

從羅馬數字我們可以得出這麼一條規律:

從左往右一位一位的看,如果這一位數字比它右邊一位的數字大或與其相等,則加上這一位代表的值,如果它比右邊一位小,則減去這一位代表的數字。

例如: 『mmcmlxiv』: 第一位是m,它的後一位也是m,所以 num = 0 + 1000,之後 m > c, num = num + 1000 =2000,之後到特殊值,因為c**:

**塊

class

solution

:def

romantoint

(self, s:

str)

->

int:

roma_nums =

num =

0for i in

range

(len

(s)-1)

:if roma_nums[s[i]

]>=roma_nums[s[i+1]

]:num += roma_nums[s[i]

]else

: num -= roma_nums[s[i]

] last_num = s[

len(s)-1

] num = num + roma_nums[last_num]

return num

LeetCode刷題之旅(簡單 13) 最大子序和

2019年6月8日 目錄 題目 解決方法1 暴力累計遍曆法 思路 效能結果 解決方法2 動態規劃 思路 效能結果 解決方法3 分治法 類似二分法 思路 效能結果 解決方法4 其他的解法 利用中間陣列過渡比較 思路 效能結果 小結 主要是利用逐步求解,以連續陣列結束位置為每一步的解,sum其實就是記錄...

leetcode刷題筆記 13

給定乙個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。自己想不到,參考解決方法,首先看到的是將所有字元與數值對映,包括單個和雙字母的組合,然後進行迴圈查詢,先查詢兩個字母,如果存在對應關係則加上值,然後i 若不存在,則查詢乙個。需要注意的是,查詢條件是i所有都對映 func ro...

LeetCode刷題之旅 滑動視窗例題

給定乙個含有n個正整數的陣列和乙個正整數s 找出該陣列中滿足其和 s的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2解釋 子陣列 4,3 是該條件下的長度最小的連續子陣列。高階 如果你已經完成了o n 時間複雜度的解法,...