1. 程式人生 > >C# 寫 LeetCode easy #13 Roman to Integer

C# 寫 LeetCode easy #13 Roman to Integer

13、Roman to Integer 

Roman numerals are represented by seven different symbols: IVXLCD and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II

 in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven 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. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 5:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

程式碼:
static void Main(string[] args)
{
    string str = "LVIV";
    int res=RomanToInteger(str);
    Console.WriteLine(res);
    Console.ReadKey();
}

private static int RomanToInteger(string str)
{
    int res = 0;
    Dictionary<char, int> dic=new Dictionary<char, int> { { 'I', 1}, { 'V', 5}, { 'X', 10}, { 'L', 50}, { 'C', 100}, { 'D', 500}, { 'M', 1000} };
    for (int i = 0; i < str.Length; ++i)
    {
        int val = dic[str[i]];
        if (i == str.Length - 1 || dic[str[i + 1]] <= dic[str[i]])
        {
            res += val;
        }
        else
        {
            res -= val;
        } 
    }
    return res;
}          

 

解析:

輸入:字串

輸出:整數

思想

  首先,分別將單個羅馬數和其所對應的整數存入字典中。

  其次,對於輸入的羅馬數,將其看作字串。設定目前數為0,開始遍歷,根據規律,從第一個字元到倒數第二個字元,每個字元在字典中的值與後一個字元比較,若前者大於後者,說明是類似於IV一樣的,需要用目前的數減去這個值。否則,用目前的數加上這個值。若迴圈到最後一個字元,則其在字典中的值直接相加,直到迴圈結束。

  最後,返回結果。

時間複雜度:O(n)