## DEV Community 👩‍💻👨‍💻

FakeStandard

Posted on • Updated on

# Roman to Integer

#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 before `V` (5) and `X` (10) to make 4 and 9.
• `X` can be placed before `L` (50) and `C` (100) to make 40 and 90.
• `C` can be placed before `D` (500) and `M` (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.
``````

### Solution

• 先過濾特定條件，判斷字串 `s` 是否為空字串或是 `null`，如果成立則返回 `0`
• 接著將羅馬符號對應的數字分別裝進 `Dictionary` 供後續轉換使用
• 建立一個 `counter` 變數儲存加總，並先 assign `s``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

LeetCode Solution

GitHub Repository

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)

👋 Have You Posted on DEV Yet?

Head over to our Welcome Thread and tell us a bit about yourself!