easy程度
目前來練~刷看看~ 題目如下:
題意
將整數轉羅馬數字
若遇到4跟9這兩種數字,表示法會不一樣。
4不會是IIII,而是IV,相當於5-1的意思,(V=5;I=1)
9不會是VIIII,而是IX,相當於10-1的意思,(X=10;I=1)
以此類推,40 = XL,90 = XC。輸入的範圍介於1 to 3999。
(XL: X= 10; L =50;) (XC :X = 10; L =100;)
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
MC = 1000(m)-100(c) = 900
M = 1000
倒過來 XC = 1000(c)-10(x) =90
倒過來 IV = 5(V)-1(I) =4
小嫩嫩如我一開始會想用 switch case 方法來寫
我的想法一開始為如果 開頭為這些數字的話 我就給他多少值
剩下的用foreach去解 他是哪個值再用
// 最後總和
var result = 0;
switch(s.Substring(0,1)){
case "I":
result = 1;
break;
case "V":
result = 5;
break;
case "X":
result = 10;
break;
case "L":
result = 50;
break;
case "C":
result = 100;
break;
case "D":
result = 500;
break;
case "M":
result = 1000;
break;
}
寫到一半就覺得 "不對喔"
程式碼太蠢了吧,我這樣要每個數字都要判斷好幾次
於是就在想了一下….
為何不先把這些一值用到的東西抽出來
抽成像是字典的東西
然後foreach 每個字去做比對
Dictionary<char, int> dic=new Dictionary<char, int> { { 'I', 1}, { 'V', 5}, { 'X', 10}, { 'L', 50}, { 'C', 100}, { 'D', 500}, { 'M', 1000} };
解法:
規則是什麼?
我們可以發現 這個規則是
由左至右 也就是從大到小去排列
若左邊大於右邊,就相加,若左邊小於右邊,就相減
下一個數字是否大於目前數字
使用字典
解法
static void Main(string[] args)
{
var str3 = "MCMXCIV";
var result3 = RomanToInt(str3);
}
static public int RomanToInt(string romanString)
{
var result = 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 < romanString.Length; i++)
{
int val = dic[romanString[i]];
var x = i == romanString.Length - 1;
if (i == romanString.Length - 1 || dic[romanString[i + 1]] <= dic[romanString[i]])
{
result += val;
}
else
{
result -= val;
}
}
return result;
}
更多方法:
主要是做我的學習筆記
偶而心血來潮寫個幾篇~
若有問題~可以寫信或在下方留言~感謝