本帥最近開始在練習LeetCode,
所以寫點文章來記錄自己的練習歷程,
遇到覺得比較值得紀錄的,會把它放上來,
供本帥之後複習使用 因為本帥不是資工背景出身的,都用自己比較容易理解的方式撰寫
所以基本上不會是最佳解,但若有更好的寫法,也歡迎交流~ ===========================================================================
難度: Easy
===========================================================================
說明:
給予一羅馬數字,將羅馬數字翻譯為我們現代使用的十進位數字,
每個羅馬數字個代表了一個數字,
羅馬數字總共有7個符號,如下表所示:
符號 |
數字 |
I |
1 |
V |
5 |
X |
10 |
L |
50 |
C |
100 |
D |
500 |
M |
1000 |
羅馬數字通常是由左而右進行加法計算:
2 = II, 12 = XII, 27=XXVII
但如果左方的符號較右方小,使用的是減法計算,下列為使用減法計算的例子:
I(1)放置在V(5)與X(10)之前: IV=4, IX=9
X(10)放置在L(50)與C(100)之前: XL=40, XC=90
C(100)放置在D(500)與M(1000)之前: CD=400, CM=900
===========================================================================
測資:
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
===========================================================================
條件限制:
1<= s字串長度 <=15
s字元只會出現:'I', 'V', 'X', 'L', 'C', 'D', 'M'
羅馬數字的範圍只會在1~3999
===========================================================================
解題:
雖然這題的標籤是Hash Table,但是在C#上弱弱的用Dictionary來解這題,
1. 先將羅馬字母的'I', 'V', 'X', 'L', 'C', 'D', 'M'個別建立key,
2. 開始搜索s字串
3. 判斷左右邊的符號大小,若左邊較右邊符號小則要進行減法計算
public class Solution
{
public int RomanToInt(string s)
{
int solution = 0; //最終解答
Dictionary<char, int> dic = new Dictionary<char, int> //幫羅馬字母建表
{
{'I', 1 },
{'V',5 },
{'X',10 },
{'L',50 },
{'C',100 },
{'D',500 },
{'M',1000 }
};
int count = 0;
while (count<s.Length)
{
if (count==s.Length-1 || dic[s[count]] >= dic[s[count + 1]]) //最後一個字母 或 左邊的數字大等於右邊
{
solution += dic[s[count]];
count++;
}
else //左邊數字小於右邊
{
solution += dic[s[count + 1]] - dic[s[count]];
count += 2; //右邊數計算過,所以跳過
}
}
return solution;
}
}