切換
舊版
前往
大廳
主題

LeetCode - 13. Roman to Integer 解題心得

Not In My Back Yard | 2020-07-26 00:00:17 | 巴幣 0 | 人氣 252

題目連結:


題目意譯:
羅馬數字有七個相異符號:I 、 V 、 X 、 L 、 C 、 D 以及 M 。
符號      值
I        1
V        5
X        10
L        50
C        100
D        500
M        1000

例如: 2 在羅馬數字表示法中被寫為 II ,就是兩個 1 並排在一起形成 2 ; 12 被寫作 XII ,即 X + II;數字 27 寫為 XXVII,則是 XX + V + II 。

羅馬數字基本上由大到小、從左至右書寫。但是,數字 4 的表示法並非為 IIII ,而是 IV 。因為寫在 V 前面的 I 代表我們應該要減去那個 I 值而形成了 4 。同樣地, 9 被寫為 IX 而非 XIIII。有六種情況會使用到這種減法規則:
I 可以放在 V (5) 和 X (10) 前面,形成 4 和 9.
X 可以放在 L (50) 和 C (100) 前面,形成 40 和 90.
C 可以放在 D (500) 和 M (1000) 前面,形成 400 和 900.

給定一個羅馬數字 s ,請將其轉為一個一般整數。

限制:
1 ≦ s.length ≦ 15
s 只由 ('I', 'V', 'X', 'L', 'C', 'D', 'M') 之字元組成。
保證 s 是一個合法的羅馬數字且其值位於範圍 [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.


解題思維:
因為在沒有使用到減法規則時,羅馬數字是由大到小書寫的。因此掃過給定的數字 s 時,可以看看當前位數 s[i] 是否小於(以符號代表的值去看)下一位數 s[i + 1]。如果較小就表示該使用減法規則,即 s[i + 1] 符號代表的值 - s[i] 符號代表的值,並且迴圈下一個看的位置應為 i + 2 ,因為 s[i + 1] 已經使用過了。

如果 s[i] 沒有比較小,或是該位數已經是尾端了,沒有下一位數,則直接加上 s[i] 代表的值即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作