#13.Roman to Integer
Problem statement
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, 2
is written as II
in Roman numeral, just two ones added together. 12
is written as XII
, which is simply X + II
. The number 27
is written as XXVII
, which is XX + V + II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
-
I
can be placed beforeV
(5) andX
(10) to make 4 and 9. -
X
can be placed beforeL
(50) andC
(100) to make 40 and 90. -
C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.
Given a roman numeral, convert it to an integer.
Example 1
Input: s = "III"
Output: 3
Explanation: III = 3.
Example 2
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 3
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Explanation
給定一個羅馬數字將其轉換成阿拉伯數字,羅馬數字通常會從左到右、由大到小來撰寫,但有一特性,數字 4
不寫成 IIII
而是 IV
,因為 4
在 5
之前,所以用 V
減去一個 I
得到 IV
也就是等於 4
。
相同原則下也是適用於 9
,轉換成羅馬數字為 IX
,題目也提供了六種使用這種減法的案例。
Solution
- 先過濾特定條件,判斷字串
s
是否為空字串或是null
,如果成立則返回0
- 接著將羅馬符號對應的數字分別裝進
Dictionary
供後續轉換使用 - 建立一個
counter
變數儲存加總,並先 assigns
第0
個索引轉換後的值 - 迴圈走訪字串內的從所有字符(除了第一個字),用一個
If Statements
來判斷是加法還是減法,正常原則是由大到小,所以條件可設為這次的羅馬符號大於上次則為減法- 條件成立:加總這次轉換的數值
- 條件不成立:邏輯是減去上次加總的,再加上這次的數值減去上次的數值
- 最後返回結果 counter
public int RomanToInt(string s)
{
if (s == null || s == String.Empty)
return 0;
IDictionary dic = new Dictionary<char, int>
{
{ 'I', 1 },
{ 'V', 5 },
{ 'X', 10 },
{ 'L', 50 },
{ 'C', 100 },
{ 'D', 500 },
{ 'M', 1000 }
};
int counter = (int)dic[s[0]];
for (int i = 0; i < s.Length; i++)
{
if ((int)dic[s[i - 1]] >= (int)dic[s[i]])
counter += (int)dic[s[i]];
else
counter += (int)dic[s[i]] - (int)dic[s[i - 1]] * 2;
}
return counter;
}
Reference
Thanks for reading the article 🌷 🌻 🌼
If you like it, please don't hesitate to click heart button ❤️
or click like on my Leetcode solution
or follow my GitHub ⭐
or buy me a coffee ⬇️ I'd appreciate it.
Top comments (0)